diff --git a/eclair-core/pom.xml b/eclair-core/pom.xml index 8b8496b062..b72cb3f461 100644 --- a/eclair-core/pom.xml +++ b/eclair-core/pom.xml @@ -252,6 +252,11 @@ guava ${guava.version} + + com.softwaremill.quicklens + quicklens_${scala.version.short} + 1.5.0 + io.kamon @@ -264,12 +269,6 @@ ${kamon.version} - - com.softwaremill.quicklens - quicklens_${scala.version.short} - 1.5.0 - test - com.typesafe.akka akka-testkit_${scala.version.short} diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/channel/Channel.scala b/eclair-core/src/main/scala/fr/acinq/eclair/channel/Channel.scala index 7756577489..17619306d6 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/channel/Channel.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/channel/Channel.scala @@ -499,7 +499,7 @@ class Channel(val nodeParams: NodeParams, val wallet: EclairWallet, remoteNodeId signature = localSigOfRemoteTx ) val commitments = Commitments(channelVersion, localParams, remoteParams, channelFlags, - LocalCommit(0, localSpec, PublishableTxs(signedLocalCommitTx, Nil)), RemoteCommit(0, remoteSpec, remoteCommitTx.tx.txid, remoteFirstPerCommitmentPoint), + LocalCommit(0, localSpec, CommitTxAndRemoteSig(localCommitTx, remoteSig), htlcTxsAndRemoteSigs = Nil), RemoteCommit(0, remoteSpec, remoteCommitTx.tx.txid, remoteFirstPerCommitmentPoint), LocalChanges(Nil, Nil, Nil), RemoteChanges(Nil, Nil, Nil), localNextHtlcId = 0L, remoteNextHtlcId = 0L, originChannels = Map.empty, @@ -542,7 +542,7 @@ class Channel(val nodeParams: NodeParams, val wallet: EclairWallet, remoteNodeId case Success(_) => val commitInput = localCommitTx.input val commitments = Commitments(channelVersion, localParams, remoteParams, channelFlags, - LocalCommit(0, localSpec, PublishableTxs(signedLocalCommitTx, Nil)), remoteCommit, + LocalCommit(0, localSpec, CommitTxAndRemoteSig(localCommitTx, remoteSig), htlcTxsAndRemoteSigs = Nil), remoteCommit, LocalChanges(Nil, Nil, Nil), RemoteChanges(Nil, Nil, Nil), localNextHtlcId = 0L, remoteNextHtlcId = 0L, originChannels = Map.empty, @@ -606,7 +606,7 @@ class Channel(val nodeParams: NodeParams, val wallet: EclairWallet, remoteNodeId stay using d.copy(deferred = Some(msg)) // no need to store, they will re-send if we get disconnected case Event(WatchFundingConfirmedTriggered(blockHeight, txIndex, fundingTx), d@DATA_WAIT_FOR_FUNDING_CONFIRMED(commitments, _, initialRelayFees_opt, _, deferred, _)) => - Try(Transaction.correctlySpends(commitments.localCommit.publishableTxs.commitTx.tx, Seq(fundingTx), ScriptFlags.STANDARD_SCRIPT_VERIFY_FLAGS)) match { + Try(Transaction.correctlySpends(commitments.fullySignedLocalCommitTx(keyManager).tx, Seq(fundingTx), ScriptFlags.STANDARD_SCRIPT_VERIFY_FLAGS)) match { case Success(_) => log.info(s"channelId=${commitments.channelId} was confirmed at blockHeight=$blockHeight txIndex=$txIndex") blockchain ! WatchFundingLost(self, commitments.commitInput.outPoint.txid, nodeParams.minDepthBlocks) @@ -1819,7 +1819,7 @@ class Channel(val nodeParams: NodeParams, val wallet: EclairWallet, remoteNodeId // peer doesn't cancel the timer case Event(TickChannelOpenTimeout, _) => stay - case Event(WatchFundingSpentTriggered(tx), d: HasCommitments) if tx.txid == d.commitments.localCommit.publishableTxs.commitTx.tx.txid => + case Event(WatchFundingSpentTriggered(tx), d: HasCommitments) if tx.txid == d.commitments.localCommit.commitTxAndRemoteSig.commitTx.tx.txid => log.warning(s"processing local commit spent in catch-all handler") spendLocalCurrent(d) } @@ -2016,7 +2016,7 @@ class Channel(val nodeParams: NodeParams, val wallet: EclairWallet, remoteNodeId private def watchFundingTx(commitments: Commitments, additionalKnownSpendingTxs: Set[ByteVector32] = Set.empty): Unit = { // TODO: should we wait for an acknowledgment from the watcher? - val knownSpendingTxs = Set(commitments.localCommit.publishableTxs.commitTx.tx.txid, commitments.remoteCommit.txid) ++ commitments.remoteNextCommitInfo.left.toSeq.map(_.nextRemoteCommit.txid).toSet ++ additionalKnownSpendingTxs + val knownSpendingTxs = Set(commitments.localCommit.commitTxAndRemoteSig.commitTx.tx.txid, commitments.remoteCommit.txid) ++ commitments.remoteNextCommitInfo.left.toSeq.map(_.nextRemoteCommit.txid).toSet ++ additionalKnownSpendingTxs blockchain ! WatchFundingSpent(self, commitments.commitInput.outPoint.txid, commitments.commitInput.outPoint.index.toInt, knownSpendingTxs) // TODO: implement this? (not needed if we use a reasonable min_depth) //blockchain ! WatchLost(self, commitments.commitInput.outPoint.txid, nodeParams.minDepthBlocks, BITCOIN_FUNDING_LOST) @@ -2214,7 +2214,7 @@ class Channel(val nodeParams: NodeParams, val wallet: EclairWallet, remoteNodeId log.warning("we have an outdated commitment: will not publish our local tx") stay } else { - val commitTx = d.commitments.localCommit.publishableTxs.commitTx.tx + val commitTx = d.commitments.fullySignedLocalCommitTx(keyManager).tx val localCommitPublished = Helpers.Closing.claimCurrentLocalCommitTxOutputs(keyManager, d.commitments, commitTx, nodeParams.onChainFeeConf.feeEstimator, nodeParams.onChainFeeConf.feeTargets) val nextData = d match { case closing: DATA_CLOSING => closing.copy(localCommitPublished = Some(localCommitPublished)) @@ -2393,7 +2393,7 @@ class Channel(val nodeParams: NodeParams, val wallet: EclairWallet, remoteNodeId val error = Error(d.channelId, exc.getMessage) // let's try to spend our current local tx - val commitTx = d.commitments.localCommit.publishableTxs.commitTx.tx + val commitTx = d.commitments.fullySignedLocalCommitTx(keyManager).tx val localCommitPublished = Helpers.Closing.claimCurrentLocalCommitTxOutputs(keyManager, d.commitments, commitTx, nodeParams.onChainFeeConf.feeEstimator, nodeParams.onChainFeeConf.feeTargets) goto(ERR_INFORMATION_LEAK) calling doPublish(localCommitPublished, d.commitments) sending error diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/channel/Commitments.scala b/eclair-core/src/main/scala/fr/acinq/eclair/channel/Commitments.scala index fca7ecf808..20d59ac41a 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/channel/Commitments.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/channel/Commitments.scala @@ -39,9 +39,9 @@ case class RemoteChanges(proposed: List[UpdateMessage], acked: List[UpdateMessag def all: List[UpdateMessage] = proposed ++ signed ++ acked } case class Changes(ourChanges: LocalChanges, theirChanges: RemoteChanges) -case class HtlcTxAndSigs(txinfo: HtlcTx, localSig: ByteVector64, remoteSig: ByteVector64) -case class PublishableTxs(commitTx: CommitTx, htlcTxsAndSigs: List[HtlcTxAndSigs]) -case class LocalCommit(index: Long, spec: CommitmentSpec, publishableTxs: PublishableTxs) +case class HtlcTxAndRemoteSig(htlcTx: HtlcTx, remoteSig: ByteVector64) +case class CommitTxAndRemoteSig(commitTx: CommitTx, remoteSig: ByteVector64) +case class LocalCommit(index: Long, spec: CommitmentSpec, commitTxAndRemoteSig: CommitTxAndRemoteSig, htlcTxsAndRemoteSigs: List[HtlcTxAndRemoteSig]) case class RemoteCommit(index: Long, spec: CommitmentSpec, txid: ByteVector32, remotePerCommitmentPoint: PublicKey) case class WaitingForRevocation(nextRemoteCommit: RemoteCommit, sent: CommitSig, sentAfterLocalCommitIndex: Long, reSignAsap: Boolean = false) // @formatter:on @@ -144,9 +144,18 @@ case class Commitments(channelVersion: ChannelVersion, localCommit.spec.htlcs.collect(incoming).filter(nearlyExpired) } - def addLocalProposal(proposal: UpdateMessage): Commitments = Commitments.addLocalProposal(this, proposal) - - def addRemoteProposal(proposal: UpdateMessage): Commitments = Commitments.addRemoteProposal(this, proposal) + /** + * Return a fully signed commit tx, that can be published as-is. + */ + def fullySignedLocalCommitTx(keyManager: ChannelKeyManager): CommitTx = { + val unsignedCommitTx = localCommit.commitTxAndRemoteSig.commitTx + val localSig = keyManager.sign(unsignedCommitTx, keyManager.fundingPublicKey(localParams.fundingKeyPath), TxOwner.Local, commitmentFormat) + val remoteSig = localCommit.commitTxAndRemoteSig.remoteSig + val commitTx = Transactions.addSigs(unsignedCommitTx, keyManager.fundingPublicKey(localParams.fundingKeyPath).publicKey, remoteParams.fundingPubKey, localSig, remoteSig) + // We verify the remote signature when receiving their commit_sig, so this check should always pass. + require(Transactions.checkSpendable(commitTx).isSuccess, "commit signatures are invalid") + commitTx + } val commitmentFormat: CommitmentFormat = channelVersion.commitmentFormat @@ -598,36 +607,25 @@ object Commitments { val channelKeyPath = keyManager.keyPath(commitments.localParams, commitments.channelVersion) val localPerCommitmentPoint = keyManager.commitmentPoint(channelKeyPath, commitments.localCommit.index + 1) val (localCommitTx, htlcTxs) = makeLocalTxs(keyManager, channelVersion, localCommit.index + 1, localParams, remoteParams, commitInput, localPerCommitmentPoint, spec) - val sig = keyManager.sign(localCommitTx, keyManager.fundingPublicKey(commitments.localParams.fundingKeyPath), TxOwner.Local, commitmentFormat) log.info(s"built local commit number=${localCommit.index + 1} toLocalMsat=${spec.toLocal.toLong} toRemoteMsat=${spec.toRemote.toLong} htlc_in={} htlc_out={} feeratePerKw=${spec.feeratePerKw} txid=${localCommitTx.tx.txid} tx={}", spec.htlcs.collect(incoming).map(_.id).mkString(","), spec.htlcs.collect(outgoing).map(_.id).mkString(","), localCommitTx.tx) - // no need to compute htlc sigs if commit sig doesn't check out - val signedCommitTx = Transactions.addSigs(localCommitTx, keyManager.fundingPublicKey(commitments.localParams.fundingKeyPath).publicKey, remoteParams.fundingPubKey, sig, commit.signature) - if (Transactions.checkSpendable(signedCommitTx).isFailure) { - return Left(InvalidCommitmentSignature(commitments.channelId, signedCommitTx.tx)) + if (!Transactions.checkSig(localCommitTx, commit.signature, remoteParams.fundingPubKey, TxOwner.Remote, commitmentFormat)) { + return Left(InvalidCommitmentSignature(commitments.channelId, localCommitTx.tx)) } - val sortedHtlcTxs: Seq[TransactionWithInputInfo] = htlcTxs.sortBy(_.input.outPoint.index) + val sortedHtlcTxs: Seq[HtlcTx] = htlcTxs.sortBy(_.input.outPoint.index) if (commit.htlcSignatures.size != sortedHtlcTxs.size) { return Left(HtlcSigCountMismatch(commitments.channelId, sortedHtlcTxs.size, commit.htlcSignatures.size)) } - val htlcSigs = sortedHtlcTxs.map(keyManager.sign(_, keyManager.htlcPoint(channelKeyPath), localPerCommitmentPoint, TxOwner.Local, commitmentFormat)) + val remoteHtlcPubkey = Generators.derivePubKey(remoteParams.htlcBasepoint, localPerCommitmentPoint) - // combine the sigs to make signed txes - val htlcTxsAndSigs = (sortedHtlcTxs, htlcSigs, commit.htlcSignatures).zipped.toList.collect { - case (htlcTx: HtlcTimeoutTx, localSig, remoteSig) => - if (Transactions.checkSpendable(Transactions.addSigs(htlcTx, localSig, remoteSig, commitmentFormat)).isFailure) { - return Left(InvalidHtlcSignature(commitments.channelId, htlcTx.tx)) - } - HtlcTxAndSigs(htlcTx, localSig, remoteSig) - case (htlcTx: HtlcSuccessTx, localSig, remoteSig) => - // we can't check that htlc-success tx are spendable because we need the payment preimage; thus we only check the remote sig - // we verify the signature from their point of view, where it is a remote tx + val htlcTxsAndRemoteSigs = sortedHtlcTxs.zip(commit.htlcSignatures).toList.map { + case (htlcTx: HtlcTx, remoteSig) => if (!Transactions.checkSig(htlcTx, remoteSig, remoteHtlcPubkey, TxOwner.Remote, commitmentFormat)) { return Left(InvalidHtlcSignature(commitments.channelId, htlcTx.tx)) } - HtlcTxAndSigs(htlcTx, localSig, remoteSig) + HtlcTxAndRemoteSig(htlcTx, remoteSig) } // we will send our revocation preimage + our next revocation hash @@ -643,7 +641,8 @@ object Commitments { val localCommit1 = LocalCommit( index = localCommit.index + 1, spec, - publishableTxs = PublishableTxs(signedCommitTx, htlcTxsAndSigs)) + commitTxAndRemoteSig = CommitTxAndRemoteSig(localCommitTx, commit.signature), + htlcTxsAndRemoteSigs = htlcTxsAndRemoteSigs) val ourChanges1 = localChanges.copy(acked = Nil) val theirChanges1 = remoteChanges.copy(proposed = Nil, acked = remoteChanges.acked ++ remoteChanges.proposed) val commitments1 = commitments.copy(localCommit = localCommit1, localChanges = ourChanges1, remoteChanges = theirChanges1) diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/channel/Helpers.scala b/eclair-core/src/main/scala/fr/acinq/eclair/channel/Helpers.scala index 6cc1d64e45..4b3f0425c4 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/channel/Helpers.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/channel/Helpers.scala @@ -465,7 +465,7 @@ object Helpers { def checkClosingSignature(keyManager: ChannelKeyManager, commitments: Commitments, localScriptPubkey: ByteVector, remoteScriptPubkey: ByteVector, remoteClosingFee: Satoshi, remoteClosingSig: ByteVector64)(implicit log: LoggingAdapter): Either[ChannelException, ClosingTx] = { import commitments._ - val lastCommitFeeSatoshi = commitments.commitInput.txOut.amount - commitments.localCommit.publishableTxs.commitTx.tx.txOut.map(_.amount).sum + val lastCommitFeeSatoshi = commitments.commitInput.txOut.amount - commitments.localCommit.commitTxAndRemoteSig.commitTx.tx.txOut.map(_.amount).sum if (remoteClosingFee > lastCommitFeeSatoshi && !commitments.channelVersion.hasAnchorOutputs) { log.error(s"remote proposed a commit fee higher than the last commitment fee: remoteClosingFeeSatoshi=${remoteClosingFee.toLong} lastCommitFeeSatoshi=$lastCommitFeeSatoshi") Left(InvalidCloseFee(commitments.channelId, remoteClosingFee)) @@ -504,7 +504,7 @@ object Helpers { */ def claimCurrentLocalCommitTxOutputs(keyManager: ChannelKeyManager, commitments: Commitments, tx: Transaction, feeEstimator: FeeEstimator, feeTargets: FeeTargets)(implicit log: LoggingAdapter): LocalCommitPublished = { import commitments._ - require(localCommit.publishableTxs.commitTx.tx.txid == tx.txid, "txid mismatch, provided tx is not the current local commit tx") + require(localCommit.commitTxAndRemoteSig.commitTx.tx.txid == tx.txid, "txid mismatch, provided tx is not the current local commit tx") val channelKeyPath = keyManager.keyPath(localParams, channelVersion) val localPerCommitmentPoint = keyManager.commitmentPoint(channelKeyPath, commitments.localCommit.index.toInt) val localRevocationPubkey = Generators.revocationPubKey(remoteParams.revocationBasepoint, localPerCommitmentPoint) @@ -523,11 +523,12 @@ object Helpers { // those are the preimages to existing received htlcs val preimages = commitments.localChanges.all.collect { case u: UpdateFulfillHtlc => u.paymentPreimage }.map(r => Crypto.sha256(r) -> r).toMap - val htlcTxs: Map[OutPoint, Option[HtlcTx]] = localCommit.publishableTxs.htlcTxsAndSigs.collect { - case HtlcTxAndSigs(txInfo@HtlcSuccessTx(_, _, paymentHash, _), localSig, remoteSig) => + val htlcTxs: Map[OutPoint, Option[HtlcTx]] = localCommit.htlcTxsAndRemoteSigs.collect { + case HtlcTxAndRemoteSig(txInfo@HtlcSuccessTx(_, _, paymentHash, _), remoteSig) => if (preimages.contains(paymentHash)) { // incoming htlc for which we have the preimage: we can spend it immediately txInfo.input.outPoint -> generateTx("htlc-success") { + val localSig = keyManager.sign(txInfo, keyManager.htlcPoint(channelKeyPath), localPerCommitmentPoint, TxOwner.Local, commitmentFormat) Right(Transactions.addSigs(txInfo, localSig, remoteSig, preimages(paymentHash), commitmentFormat)) } } else { @@ -535,9 +536,10 @@ object Helpers { // preimage later, otherwise it will eventually timeout and they will get their funds back txInfo.input.outPoint -> None } - case HtlcTxAndSigs(txInfo: HtlcTimeoutTx, localSig, remoteSig) => + case HtlcTxAndRemoteSig(txInfo: HtlcTimeoutTx, remoteSig) => // outgoing htlc: they may or may not have the preimage, the only thing to do is try to get back our funds after timeout txInfo.input.outPoint -> generateTx("htlc-timeout") { + val localSig = keyManager.sign(txInfo, keyManager.htlcPoint(channelKeyPath), localPerCommitmentPoint, TxOwner.Local, commitmentFormat) Right(Transactions.addSigs(txInfo, localSig, remoteSig, commitmentFormat)) } }.toMap @@ -956,7 +958,7 @@ object Helpers { */ def timedOutHtlcs(commitmentFormat: CommitmentFormat, localCommit: LocalCommit, localCommitPublished: LocalCommitPublished, localDustLimit: Satoshi, tx: Transaction)(implicit log: LoggingAdapter): Set[UpdateAddHtlc] = { val untrimmedHtlcs = Transactions.trimOfferedHtlcs(localDustLimit, localCommit.spec, commitmentFormat).map(_.add) - if (tx.txid == localCommit.publishableTxs.commitTx.tx.txid) { + if (tx.txid == localCommit.commitTxAndRemoteSig.commitTx.tx.txid) { // the tx is a commitment tx, we can immediately fail all dust htlcs (they don't have an output in the tx) localCommit.spec.htlcs.collect(outgoing) -- untrimmedHtlcs } else { @@ -1036,7 +1038,7 @@ object Helpers { * @param tx a transaction that is sufficiently buried in the blockchain */ def onChainOutgoingHtlcs(localCommit: LocalCommit, remoteCommit: RemoteCommit, nextRemoteCommit_opt: Option[RemoteCommit], tx: Transaction): Set[UpdateAddHtlc] = { - if (localCommit.publishableTxs.commitTx.tx.txid == tx.txid) { + if (localCommit.commitTxAndRemoteSig.commitTx.tx.txid == tx.txid) { localCommit.spec.htlcs.collect(outgoing) } else if (remoteCommit.txid == tx.txid) { remoteCommit.spec.htlcs.collect(incoming) @@ -1055,7 +1057,7 @@ object Helpers { val localCommit = d.commitments.localCommit val remoteCommit = d.commitments.remoteCommit val nextRemoteCommit_opt = d.commitments.remoteNextCommitInfo.left.toOption.map(_.nextRemoteCommit) - if (localCommit.publishableTxs.commitTx.tx.txid == tx.txid) { + if (localCommit.commitTxAndRemoteSig.commitTx.tx.txid == tx.txid) { // our commit got confirmed, so any htlc that is in their commitment but not in ours will never reach the chain val htlcsInRemoteCommit = remoteCommit.spec.htlcs ++ nextRemoteCommit_opt.map(_.spec.htlcs).getOrElse(Set.empty) // NB: from the p.o.v of remote, their incoming htlcs are our outgoing htlcs diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/channel/publish/ReplaceableTxPublisher.scala b/eclair-core/src/main/scala/fr/acinq/eclair/channel/publish/ReplaceableTxPublisher.scala index 0aeb27c5a6..7ab258901c 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/channel/publish/ReplaceableTxPublisher.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/channel/publish/ReplaceableTxPublisher.scala @@ -26,7 +26,7 @@ import fr.acinq.eclair.blockchain.bitcoind.rpc.ExtendedBitcoinClient.FundTransac import fr.acinq.eclair.blockchain.fee.FeeratePerKw import fr.acinq.eclair.channel.publish.TxPublisher.TxPublishLogContext import fr.acinq.eclair.channel.publish.TxTimeLocksMonitor.CheckTx -import fr.acinq.eclair.channel.{Commitments, HtlcTxAndSigs} +import fr.acinq.eclair.channel.{Commitments, HtlcTxAndRemoteSig} import fr.acinq.eclair.transactions.Transactions import fr.acinq.eclair.transactions.Transactions._ import fr.acinq.eclair.wire.protocol.UpdateFulfillHtlc @@ -145,13 +145,13 @@ object ReplaceableTxPublisher { commitments.localChanges.all.collectFirst { case u: UpdateFulfillHtlc if Crypto.sha256(u.paymentPreimage) == tx.paymentHash => u.paymentPreimage }.flatMap(preimage => { - commitments.localCommit.publishableTxs.htlcTxsAndSigs.collectFirst { - case HtlcTxAndSigs(HtlcSuccessTx(input, _, _, _), _, remoteSig) if input.outPoint == tx.input.outPoint => HtlcSuccess(tx, remoteSig, preimage) + commitments.localCommit.htlcTxsAndRemoteSigs.collectFirst { + case HtlcTxAndRemoteSig(HtlcSuccessTx(input, _, _, _), remoteSig) if input.outPoint == tx.input.outPoint => HtlcSuccess(tx, remoteSig, preimage) } }) case tx: HtlcTimeoutTx => - commitments.localCommit.publishableTxs.htlcTxsAndSigs.collectFirst { - case HtlcTxAndSigs(HtlcTimeoutTx(input, _, _), _, remoteSig) if input.outPoint == tx.input.outPoint => HtlcTimeout(tx, remoteSig) + commitments.localCommit.htlcTxsAndRemoteSigs.collectFirst { + case HtlcTxAndRemoteSig(HtlcTimeoutTx(input, _, _), remoteSig) if input.outPoint == tx.input.outPoint => HtlcTimeout(tx, remoteSig) } } } @@ -206,7 +206,7 @@ private class ReplaceableTxPublisher(nodeParams: NodeParams, // - our commit is not confirmed (if it is, no need to claim our anchor) // - their commit is not confirmed (if it is, no need to claim our anchor either) // - our commit tx is in the mempool (otherwise we can't claim our anchor) - val commitTx = cmd.commitments.localCommit.publishableTxs.commitTx.tx + val commitTx = cmd.commitments.fullySignedLocalCommitTx(nodeParams.channelKeyManager).tx val fundingOutpoint = cmd.commitments.commitInput.outPoint context.pipeToSelf(bitcoinClient.isTransactionOutputSpendable(fundingOutpoint.txid, fundingOutpoint.index.toInt, includeMempool = false).flatMap { case false => Future.failed(CommitTxAlreadyConfirmed) @@ -368,7 +368,7 @@ private class ReplaceableTxPublisher(nodeParams: NodeParams, private def addInputs(txInfo: ClaimLocalAnchorOutputTx, targetFeerate: FeeratePerKw, commitments: Commitments): Future[ClaimLocalAnchorOutputTx] = { val dustLimit = commitments.localParams.dustLimit val commitFeerate = commitments.localCommit.spec.feeratePerKw - val commitTx = commitments.localCommit.publishableTxs.commitTx.tx + val commitTx = commitments.fullySignedLocalCommitTx(nodeParams.channelKeyManager).tx // We want the feerate of the package (commit tx + tx spending anchor) to equal targetFeerate. // Thus we have: anchorFeerate = targetFeerate + (weight-commit-tx / weight-anchor-tx) * (targetFeerate - commitTxFeerate) // If we use the smallest weight possible for the anchor tx, the feerate we use will thus be greater than what we want, diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/crypto/WeakEntropyPool.scala b/eclair-core/src/main/scala/fr/acinq/eclair/crypto/WeakEntropyPool.scala index 8214ae2f76..34989aec9d 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/crypto/WeakEntropyPool.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/crypto/WeakEntropyPool.scala @@ -59,7 +59,7 @@ object WeakEntropyPool { context.system.eventStream ! EventStream.Subscribe(context.messageAdapter[ChannelPaymentRelayed](e => WrappedPaymentRelayed(e.paymentHash, e.timestamp))) context.system.eventStream ! EventStream.Subscribe(context.messageAdapter[PeerConnected](e => WrappedPeerConnected(e.nodeId))) context.system.eventStream ! EventStream.Subscribe(context.messageAdapter[NodeUpdated](e => WrappedNodeUpdated(e.ann.signature))) - context.system.eventStream ! EventStream.Subscribe(context.messageAdapter[ChannelSignatureReceived](e => WrappedChannelSignature(e.commitments.localCommit.publishableTxs.commitTx.tx.wtxid))) + context.system.eventStream ! EventStream.Subscribe(context.messageAdapter[ChannelSignatureReceived](e => WrappedChannelSignature(e.commitments.localCommit.commitTxAndRemoteSig.commitTx.tx.wtxid))) Behaviors.withTimers { timers => timers.startTimerWithFixedDelay(FlushEntropy, 30 seconds) collecting(collector, None) diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/wire/internal/channel/ChannelCodecs.scala b/eclair-core/src/main/scala/fr/acinq/eclair/wire/internal/channel/ChannelCodecs.scala index a0617508f4..6a8fb44bfb 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/wire/internal/channel/ChannelCodecs.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/wire/internal/channel/ChannelCodecs.scala @@ -20,6 +20,7 @@ import fr.acinq.eclair.channel.HasCommitments import fr.acinq.eclair.wire.internal.channel.version0.ChannelCodecs0 import fr.acinq.eclair.wire.internal.channel.version1.ChannelCodecs1 import fr.acinq.eclair.wire.internal.channel.version2.ChannelCodecs2 +import fr.acinq.eclair.wire.internal.channel.version3.ChannelCodecs3 import grizzled.slf4j.Logging import scodec.Codec import scodec.codecs.{byte, discriminated} @@ -47,7 +48,7 @@ import scodec.codecs.{byte, discriminated} val stateDataCodec: Codec[HasCommitments] = ... * }}} * - * Notice that the outer class has a visibility restricted to package [[channel]], while the inner class has a + * Notice that the outer class has a visibility restricted to package [[fr.acinq.eclair.wire.internal.channel]], while the inner class has a * visibility restricted to package [[version0]]. This guarantees that we strictly segregate each codec version, * while still allowing unitary testing. * @@ -65,8 +66,9 @@ object ChannelCodecs extends Logging { * More info here: /~https://github.com/scodec/scodec/issues/122 */ val stateDataCodec: Codec[HasCommitments] = discriminated[HasCommitments].by(byte) - .typecase(2, ChannelCodecs2.stateDataCodec) - .typecase(1, ChannelCodecs1.stateDataCodec) - .typecase(0, ChannelCodecs0.stateDataCodec) + .typecase(3, ChannelCodecs3.stateDataCodec) + .typecase(2, ChannelCodecs2.stateDataCodec.decodeOnly) + .typecase(1, ChannelCodecs1.stateDataCodec.decodeOnly) + .typecase(0, ChannelCodecs0.stateDataCodec.decodeOnly) } diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/wire/internal/channel/version0/ChannelCodecs0.scala b/eclair-core/src/main/scala/fr/acinq/eclair/wire/internal/channel/version0/ChannelCodecs0.scala index 0af1bc5698..488f259d3a 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/wire/internal/channel/version0/ChannelCodecs0.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/wire/internal/channel/version0/ChannelCodecs0.scala @@ -16,6 +16,7 @@ package fr.acinq.eclair.wire.internal.channel.version0 +import fr.acinq.bitcoin.Crypto.PublicKey import fr.acinq.bitcoin.DeterministicWallet.{ExtendedPrivateKey, KeyPath} import fr.acinq.bitcoin.{ByteVector32, ByteVector64, Crypto, OutPoint, Transaction, TxOut} import fr.acinq.eclair.MilliSatoshi @@ -23,6 +24,7 @@ import fr.acinq.eclair.channel._ import fr.acinq.eclair.crypto.ShaChain import fr.acinq.eclair.transactions.Transactions._ import fr.acinq.eclair.transactions._ +import fr.acinq.eclair.wire.internal.channel.version0.ChannelTypes0.{HtlcTxAndSigs, PublishableTxs} import fr.acinq.eclair.wire.protocol.CommonCodecs._ import fr.acinq.eclair.wire.protocol.LightningMessageCodecs._ import fr.acinq.eclair.wire.protocol.UpdateMessage @@ -152,10 +154,10 @@ private[channel] object ChannelCodecs0 { ("commitTx" | (("inputInfo" | inputInfoCodec) :: ("tx" | txCodec)).as[CommitTx]) :: ("htlcTxsAndSigs" | listOfN(uint16, htlcTxAndSigsCodec))).as[PublishableTxs].decodeOnly - val localCommitCodec: Codec[LocalCommit] = ( + def localCommitCodec(remoteFundingPubKey: PublicKey): Codec[LocalCommit] = ( ("index" | uint64overflow) :: ("spec" | commitmentSpecCodec) :: - ("publishableTxs" | publishableTxsCodec)).as[LocalCommit].decodeOnly + ("publishableTxs" | publishableTxsCodec)).as[ChannelTypes0.LocalCommit].map(_.migrate(remoteFundingPubKey)).decodeOnly val remoteCommitCodec: Codec[RemoteCommit] = ( ("index" | uint64overflow) :: @@ -223,19 +225,20 @@ private[channel] object ChannelCodecs0 { val commitmentsCodec: Codec[Commitments] = ( ("channelVersion" | channelVersionCodec) >>:~ { channelVersion => ("localParams" | localParamsCodec(channelVersion)) :: - ("remoteParams" | remoteParamsCodec) :: - ("channelFlags" | byte) :: - ("localCommit" | localCommitCodec) :: - ("remoteCommit" | remoteCommitCodec) :: - ("localChanges" | localChangesCodec) :: - ("remoteChanges" | remoteChangesCodec) :: - ("localNextHtlcId" | uint64overflow) :: - ("remoteNextHtlcId" | uint64overflow) :: - ("originChannels" | originsMapCodec) :: - ("remoteNextCommitInfo" | either(bool, waitingForRevocationCodec, publicKey)) :: - ("commitInput" | inputInfoCodec) :: - ("remotePerCommitmentSecrets" | ShaChain.shaChainCodec) :: - ("channelId" | bytes32) + (("remoteParams" | remoteParamsCodec) >>:~ { remoteParams => + ("channelFlags" | byte) :: + ("localCommit" | localCommitCodec(remoteParams.fundingPubKey)) :: + ("remoteCommit" | remoteCommitCodec) :: + ("localChanges" | localChangesCodec) :: + ("remoteChanges" | remoteChangesCodec) :: + ("localNextHtlcId" | uint64overflow) :: + ("remoteNextHtlcId" | uint64overflow) :: + ("originChannels" | originsMapCodec) :: + ("remoteNextCommitInfo" | either(bool, waitingForRevocationCodec, publicKey)) :: + ("commitInput" | inputInfoCodec) :: + ("remotePerCommitmentSecrets" | ShaChain.shaChainCodec) :: + ("channelId" | bytes32) + }) }).as[Commitments].decodeOnly val closingTxProposedCodec: Codec[ClosingTxProposed] = ( diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/wire/internal/channel/version0/ChannelTypes0.scala b/eclair-core/src/main/scala/fr/acinq/eclair/wire/internal/channel/version0/ChannelTypes0.scala index 5595284450..1515277242 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/wire/internal/channel/version0/ChannelTypes0.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/wire/internal/channel/version0/ChannelTypes0.scala @@ -16,8 +16,12 @@ package fr.acinq.eclair.wire.internal.channel.version0 -import fr.acinq.bitcoin.{ByteVector32, OutPoint, Satoshi, Transaction, TxOut} +import com.softwaremill.quicklens._ +import fr.acinq.bitcoin.Crypto.PublicKey +import fr.acinq.bitcoin.{ByteVector32, ByteVector64, Crypto, OP_CHECKMULTISIG, OP_PUSHDATA, OutPoint, Satoshi, Script, ScriptWitness, Transaction, TxOut} import fr.acinq.eclair.channel +import fr.acinq.eclair.channel.{CommitTxAndRemoteSig, HtlcTxAndRemoteSig} +import fr.acinq.eclair.transactions.CommitmentSpec import fr.acinq.eclair.transactions.Transactions._ private[channel] object ChannelTypes0 { @@ -95,11 +99,43 @@ private[channel] object ChannelTypes0 { } } - /** - * Starting with version2, we store a complete ClosingTx object for mutual close scenarios instead of simply storing - * the raw transaction. It provides more information for auditing but is not used for business logic, so we can safely - * put dummy values in the migration. - */ - def migrateClosingTx(tx: Transaction): ClosingTx = ClosingTx(InputInfo(tx.txIn.head.outPoint, TxOut(Satoshi(0), Nil), Nil), tx, None) + /** + * Starting with version2, we store a complete ClosingTx object for mutual close scenarios instead of simply storing + * the raw transaction. It provides more information for auditing but is not used for business logic, so we can safely + * put dummy values in the migration. + */ + def migrateClosingTx(tx: Transaction): ClosingTx = ClosingTx(InputInfo(tx.txIn.head.outPoint, TxOut(Satoshi(0), Nil), Nil), tx, None) + case class HtlcTxAndSigs(txinfo: HtlcTx, localSig: ByteVector64, remoteSig: ByteVector64) + + case class PublishableTxs(commitTx: CommitTx, htlcTxsAndSigs: List[HtlcTxAndSigs]) + + case class LocalCommit(index: Long, spec: CommitmentSpec, publishableTxs: PublishableTxs) { + def migrate(remoteFundingPubKey: PublicKey): channel.LocalCommit = { + val remoteSig = extractRemoteSig(publishableTxs.commitTx, remoteFundingPubKey) + val unsignedCommitTx = publishableTxs.commitTx.modify(_.tx.txIn.each.witness).setTo(ScriptWitness.empty) + val commitTxAndRemoteSig = CommitTxAndRemoteSig(unsignedCommitTx, remoteSig) + val htlcTxsAndRemoteSigs = publishableTxs.htlcTxsAndSigs map { + case HtlcTxAndSigs(htlcTx: HtlcSuccessTx, _, remoteSig) => + val unsignedHtlcTx = htlcTx.modify(_.tx.txIn.each.witness).setTo(ScriptWitness.empty) + HtlcTxAndRemoteSig(unsignedHtlcTx, remoteSig) + case HtlcTxAndSigs(htlcTx: HtlcTimeoutTx, _, remoteSig) => + val unsignedHtlcTx = htlcTx.modify(_.tx.txIn.each.witness).setTo(ScriptWitness.empty) + HtlcTxAndRemoteSig(unsignedHtlcTx, remoteSig) + } + channel.LocalCommit(index, spec, commitTxAndRemoteSig, htlcTxsAndRemoteSigs) + } + + private def extractRemoteSig(commitTx: CommitTx, remoteFundingPubKey: PublicKey): ByteVector64 = { + require(commitTx.tx.txIn.size == 1, s"commit tx must have exactly one input, found ${commitTx.tx.txIn.size}") + val ScriptWitness(Seq(_, sig1, sig2, redeemScript)) = commitTx.tx.txIn.head.witness + val _ :: OP_PUSHDATA(pub1, _) :: OP_PUSHDATA(pub2, _) :: _ :: OP_CHECKMULTISIG :: Nil = Script.parse(redeemScript) + require(pub1 == remoteFundingPubKey.value || pub2 == remoteFundingPubKey.value, "unrecognized funding pubkey") + if (pub1 == remoteFundingPubKey.value) { + Crypto.der2compact(sig1) + } else { + Crypto.der2compact(sig2) + } + } + } } diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/wire/internal/channel/version1/ChannelCodecs1.scala b/eclair-core/src/main/scala/fr/acinq/eclair/wire/internal/channel/version1/ChannelCodecs1.scala index 6132f0efc7..80236bc975 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/wire/internal/channel/version1/ChannelCodecs1.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/wire/internal/channel/version1/ChannelCodecs1.scala @@ -16,6 +16,7 @@ package fr.acinq.eclair.wire.internal.channel.version1 +import fr.acinq.bitcoin.Crypto.PublicKey import fr.acinq.bitcoin.DeterministicWallet.{ExtendedPrivateKey, KeyPath} import fr.acinq.bitcoin.{ByteVector32, OutPoint, Transaction, TxOut} import fr.acinq.eclair.MilliSatoshi @@ -23,10 +24,11 @@ import fr.acinq.eclair.channel._ import fr.acinq.eclair.crypto.ShaChain import fr.acinq.eclair.transactions.Transactions._ import fr.acinq.eclair.transactions.{CommitmentSpec, DirectedHtlc, IncomingHtlc, OutgoingHtlc} +import fr.acinq.eclair.wire.internal.channel.version0.ChannelTypes0 +import fr.acinq.eclair.wire.internal.channel.version0.ChannelTypes0.{HtlcTxAndSigs, PublishableTxs} import fr.acinq.eclair.wire.protocol.CommonCodecs._ import fr.acinq.eclair.wire.protocol.LightningMessageCodecs._ import fr.acinq.eclair.wire.protocol.UpdateMessage -import fr.acinq.eclair.wire.internal.channel.version0.ChannelTypes0 import scodec.codecs._ import scodec.{Attempt, Codec} @@ -125,10 +127,10 @@ private[channel] object ChannelCodecs1 { ("commitTx" | (("inputInfo" | inputInfoCodec) :: ("tx" | txCodec)).as[CommitTx]) :: ("htlcTxsAndSigs" | listOfN(uint16, htlcTxAndSigsCodec))).as[PublishableTxs] - val localCommitCodec: Codec[LocalCommit] = ( + def localCommitCodec(remoteFundingPubKey: PublicKey): Codec[LocalCommit] = ( ("index" | uint64overflow) :: ("spec" | commitmentSpecCodec) :: - ("publishableTxs" | publishableTxsCodec)).as[LocalCommit] + ("publishableTxs" | publishableTxsCodec)).as[ChannelTypes0.LocalCommit].map(_.migrate(remoteFundingPubKey)).decodeOnly val remoteCommitCodec: Codec[RemoteCommit] = ( ("index" | uint64overflow) :: @@ -184,19 +186,20 @@ private[channel] object ChannelCodecs1 { val commitmentsCodec: Codec[Commitments] = ( ("channelVersion" | channelVersionCodec) >>:~ { channelVersion => ("localParams" | localParamsCodec(channelVersion)) :: - ("remoteParams" | remoteParamsCodec) :: - ("channelFlags" | byte) :: - ("localCommit" | localCommitCodec) :: - ("remoteCommit" | remoteCommitCodec) :: - ("localChanges" | localChangesCodec) :: - ("remoteChanges" | remoteChangesCodec) :: - ("localNextHtlcId" | uint64overflow) :: - ("remoteNextHtlcId" | uint64overflow) :: - ("originChannels" | originsMapCodec) :: - ("remoteNextCommitInfo" | either(bool8, waitingForRevocationCodec, publicKey)) :: - ("commitInput" | inputInfoCodec) :: - ("remotePerCommitmentSecrets" | byteAligned(ShaChain.shaChainCodec)) :: - ("channelId" | bytes32) + (("remoteParams" | remoteParamsCodec) >>:~ { remoteParams => + ("channelFlags" | byte) :: + ("localCommit" | localCommitCodec(remoteParams.fundingPubKey)) :: + ("remoteCommit" | remoteCommitCodec) :: + ("localChanges" | localChangesCodec) :: + ("remoteChanges" | remoteChangesCodec) :: + ("localNextHtlcId" | uint64overflow) :: + ("remoteNextHtlcId" | uint64overflow) :: + ("originChannels" | originsMapCodec) :: + ("remoteNextCommitInfo" | either(bool8, waitingForRevocationCodec, publicKey)) :: + ("commitInput" | inputInfoCodec) :: + ("remotePerCommitmentSecrets" | byteAligned(ShaChain.shaChainCodec)) :: + ("channelId" | bytes32) + }) }).as[Commitments] val closingTxProposedCodec: Codec[ClosingTxProposed] = ( diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/wire/internal/channel/version2/ChannelCodecs2.scala b/eclair-core/src/main/scala/fr/acinq/eclair/wire/internal/channel/version2/ChannelCodecs2.scala index 597b526ec7..bb152da04d 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/wire/internal/channel/version2/ChannelCodecs2.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/wire/internal/channel/version2/ChannelCodecs2.scala @@ -16,6 +16,7 @@ package fr.acinq.eclair.wire.internal.channel.version2 +import fr.acinq.bitcoin.Crypto.PublicKey import fr.acinq.bitcoin.DeterministicWallet.{ExtendedPrivateKey, KeyPath} import fr.acinq.bitcoin.{OutPoint, Transaction, TxOut} import fr.acinq.eclair.MilliSatoshi @@ -23,6 +24,8 @@ import fr.acinq.eclair.channel._ import fr.acinq.eclair.crypto.ShaChain import fr.acinq.eclair.transactions.Transactions._ import fr.acinq.eclair.transactions.{CommitmentSpec, DirectedHtlc, IncomingHtlc, OutgoingHtlc} +import fr.acinq.eclair.wire.internal.channel.version0.ChannelTypes0 +import fr.acinq.eclair.wire.internal.channel.version0.ChannelTypes0.{HtlcTxAndSigs, PublishableTxs} import fr.acinq.eclair.wire.protocol.CommonCodecs._ import fr.acinq.eclair.wire.protocol.LightningMessageCodecs._ import fr.acinq.eclair.wire.protocol.UpdateMessage @@ -159,10 +162,10 @@ private[channel] object ChannelCodecs2 { ("commitTx" | (("inputInfo" | inputInfoCodec) :: ("tx" | txCodec)).as[CommitTx]) :: ("htlcTxsAndSigs" | listOfN(uint16, htlcTxAndSigsCodec))).as[PublishableTxs] - val localCommitCodec: Codec[LocalCommit] = ( + def localCommitCodec(remoteFundingPubKey: PublicKey): Codec[LocalCommit] = ( ("index" | uint64overflow) :: ("spec" | commitmentSpecCodec) :: - ("publishableTxs" | publishableTxsCodec)).as[LocalCommit] + ("publishableTxs" | publishableTxsCodec)).as[ChannelTypes0.LocalCommit].map(_.migrate(remoteFundingPubKey)).decodeOnly val remoteCommitCodec: Codec[RemoteCommit] = ( ("index" | uint64overflow) :: @@ -218,19 +221,20 @@ private[channel] object ChannelCodecs2 { val commitmentsCodec: Codec[Commitments] = ( ("channelVersion" | channelVersionCodec) >>:~ { channelVersion => ("localParams" | localParamsCodec(channelVersion)) :: - ("remoteParams" | remoteParamsCodec) :: - ("channelFlags" | byte) :: - ("localCommit" | localCommitCodec) :: - ("remoteCommit" | remoteCommitCodec) :: - ("localChanges" | localChangesCodec) :: - ("remoteChanges" | remoteChangesCodec) :: - ("localNextHtlcId" | uint64overflow) :: - ("remoteNextHtlcId" | uint64overflow) :: - ("originChannels" | originsMapCodec) :: - ("remoteNextCommitInfo" | either(bool8, waitingForRevocationCodec, publicKey)) :: - ("commitInput" | inputInfoCodec) :: - ("remotePerCommitmentSecrets" | byteAligned(ShaChain.shaChainCodec)) :: - ("channelId" | bytes32) + (("remoteParams" | remoteParamsCodec) >>:~ { remoteParams => + ("channelFlags" | byte) :: + ("localCommit" | localCommitCodec(remoteParams.fundingPubKey)) :: + ("remoteCommit" | remoteCommitCodec) :: + ("localChanges" | localChangesCodec) :: + ("remoteChanges" | remoteChangesCodec) :: + ("localNextHtlcId" | uint64overflow) :: + ("remoteNextHtlcId" | uint64overflow) :: + ("originChannels" | originsMapCodec) :: + ("remoteNextCommitInfo" | either(bool8, waitingForRevocationCodec, publicKey)) :: + ("commitInput" | inputInfoCodec) :: + ("remotePerCommitmentSecrets" | byteAligned(ShaChain.shaChainCodec)) :: + ("channelId" | bytes32) + }) }).as[Commitments] val closingTxProposedCodec: Codec[ClosingTxProposed] = ( diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/wire/internal/channel/version3/ChannelCodecs3.scala b/eclair-core/src/main/scala/fr/acinq/eclair/wire/internal/channel/version3/ChannelCodecs3.scala new file mode 100644 index 0000000000..155568ba10 --- /dev/null +++ b/eclair-core/src/main/scala/fr/acinq/eclair/wire/internal/channel/version3/ChannelCodecs3.scala @@ -0,0 +1,324 @@ +/* + * Copyright 2021 ACINQ SAS + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://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. + */ + +package fr.acinq.eclair.wire.internal.channel.version3 + +import fr.acinq.bitcoin.DeterministicWallet.{ExtendedPrivateKey, KeyPath} +import fr.acinq.bitcoin.{OutPoint, Transaction, TxOut} +import fr.acinq.eclair.MilliSatoshi +import fr.acinq.eclair.channel._ +import fr.acinq.eclair.crypto.ShaChain +import fr.acinq.eclair.transactions.Transactions._ +import fr.acinq.eclair.transactions.{CommitmentSpec, DirectedHtlc, IncomingHtlc, OutgoingHtlc} +import fr.acinq.eclair.wire.protocol.CommonCodecs._ +import fr.acinq.eclair.wire.protocol.LightningMessageCodecs._ +import fr.acinq.eclair.wire.protocol.UpdateMessage +import scodec.codecs._ +import scodec.{Attempt, Codec} + +private[channel] object ChannelCodecs3 { + + private[version3] object Codecs { + + val keyPathCodec: Codec[KeyPath] = ("path" | listOfN(uint16, uint32)).xmap[KeyPath](l => new KeyPath(l), keyPath => keyPath.path.toList).as[KeyPath] + + val extendedPrivateKeyCodec: Codec[ExtendedPrivateKey] = ( + ("secretkeybytes" | bytes32) :: + ("chaincode" | bytes32) :: + ("depth" | uint16) :: + ("path" | keyPathCodec) :: + ("parent" | int64)).as[ExtendedPrivateKey] + + val channelVersionCodec: Codec[ChannelVersion] = bits(ChannelVersion.LENGTH_BITS).as[ChannelVersion] + + def localParamsCodec(channelVersion: ChannelVersion): Codec[LocalParams] = ( + ("nodeId" | publicKey) :: + ("channelPath" | keyPathCodec) :: + ("dustLimit" | satoshi) :: + ("maxHtlcValueInFlightMsat" | uint64) :: + ("channelReserve" | satoshi) :: + ("htlcMinimum" | millisatoshi) :: + ("toSelfDelay" | cltvExpiryDelta) :: + ("maxAcceptedHtlcs" | uint16) :: + ("isFunder" | bool8) :: + ("defaultFinalScriptPubKey" | lengthDelimited(bytes)) :: + ("walletStaticPaymentBasepoint" | optional(provide(channelVersion.paysDirectlyToWallet), publicKey)) :: + ("features" | combinedFeaturesCodec)).as[LocalParams] + + val remoteParamsCodec: Codec[RemoteParams] = ( + ("nodeId" | publicKey) :: + ("dustLimit" | satoshi) :: + ("maxHtlcValueInFlightMsat" | uint64) :: + ("channelReserve" | satoshi) :: + ("htlcMinimum" | millisatoshi) :: + ("toSelfDelay" | cltvExpiryDelta) :: + ("maxAcceptedHtlcs" | uint16) :: + ("fundingPubKey" | publicKey) :: + ("revocationBasepoint" | publicKey) :: + ("paymentBasepoint" | publicKey) :: + ("delayedPaymentBasepoint" | publicKey) :: + ("htlcBasepoint" | publicKey) :: + ("features" | combinedFeaturesCodec)).as[RemoteParams] + + def setCodec[T](codec: Codec[T]): Codec[Set[T]] = listOfN(uint16, codec).xmap(_.toSet, _.toList) + + val htlcCodec: Codec[DirectedHtlc] = discriminated[DirectedHtlc].by(bool8) + .typecase(true, lengthDelimited(updateAddHtlcCodec).as[IncomingHtlc]) + .typecase(false, lengthDelimited(updateAddHtlcCodec).as[OutgoingHtlc]) + + val commitmentSpecCodec: Codec[CommitmentSpec] = ( + ("htlcs" | setCodec(htlcCodec)) :: + ("feeratePerKw" | feeratePerKw) :: + ("toLocal" | millisatoshi) :: + ("toRemote" | millisatoshi)).as[CommitmentSpec] + + val outPointCodec: Codec[OutPoint] = lengthDelimited(bytes.xmap(d => OutPoint.read(d.toArray), d => OutPoint.write(d))) + + val txOutCodec: Codec[TxOut] = lengthDelimited(bytes.xmap(d => TxOut.read(d.toArray), d => TxOut.write(d))) + + val txCodec: Codec[Transaction] = lengthDelimited(bytes.xmap(d => Transaction.read(d.toArray), d => Transaction.write(d))) + + val inputInfoCodec: Codec[InputInfo] = ( + ("outPoint" | outPointCodec) :: + ("txOut" | txOutCodec) :: + ("redeemScript" | lengthDelimited(bytes))).as[InputInfo] + + val outputInfoCodec: Codec[OutputInfo] = ( + ("index" | uint32) :: + ("amount" | satoshi) :: + ("scriptPubKey" | lengthDelimited(bytes))).as[OutputInfo] + + val commitTxCodec: Codec[CommitTx] = (("inputInfo" | inputInfoCodec) :: ("tx" | txCodec)).as[CommitTx] + val htlcSuccessTxCodec: Codec[HtlcSuccessTx] = (("inputInfo" | inputInfoCodec) :: ("tx" | txCodec) :: ("paymentHash" | bytes32) :: ("htlcId" | uint64overflow)).as[HtlcSuccessTx] + val htlcTimeoutTxCodec: Codec[HtlcTimeoutTx] = (("inputInfo" | inputInfoCodec) :: ("tx" | txCodec) :: ("htlcId" | uint64overflow)).as[HtlcTimeoutTx] + val htlcDelayedTxCodec: Codec[HtlcDelayedTx] = (("inputInfo" | inputInfoCodec) :: ("tx" | txCodec)).as[HtlcDelayedTx] + val claimHtlcSuccessTxCodec: Codec[ClaimHtlcSuccessTx] = (("inputInfo" | inputInfoCodec) :: ("tx" | txCodec) :: ("htlcId" | uint64overflow)).as[ClaimHtlcSuccessTx] + val claimHtlcTimeoutTxCodec: Codec[ClaimHtlcTimeoutTx] = (("inputInfo" | inputInfoCodec) :: ("tx" | txCodec) :: ("htlcId" | uint64overflow)).as[ClaimHtlcTimeoutTx] + val claimLocalDelayedOutputTxCodec: Codec[ClaimLocalDelayedOutputTx] = (("inputInfo" | inputInfoCodec) :: ("tx" | txCodec)).as[ClaimLocalDelayedOutputTx] + val claimP2WPKHOutputTxCodec: Codec[ClaimP2WPKHOutputTx] = (("inputInfo" | inputInfoCodec) :: ("tx" | txCodec)).as[ClaimP2WPKHOutputTx] + val claimRemoteDelayedOutputTxCodec: Codec[ClaimRemoteDelayedOutputTx] = (("inputInfo" | inputInfoCodec) :: ("tx" | txCodec)).as[ClaimRemoteDelayedOutputTx] + val mainPenaltyTxCodec: Codec[MainPenaltyTx] = (("inputInfo" | inputInfoCodec) :: ("tx" | txCodec)).as[MainPenaltyTx] + val htlcPenaltyTxCodec: Codec[HtlcPenaltyTx] = (("inputInfo" | inputInfoCodec) :: ("tx" | txCodec)).as[HtlcPenaltyTx] + val claimHtlcDelayedOutputPenaltyTxCodec: Codec[ClaimHtlcDelayedOutputPenaltyTx] = (("inputInfo" | inputInfoCodec) :: ("tx" | txCodec)).as[ClaimHtlcDelayedOutputPenaltyTx] + val claimLocalAnchorOutputTxCodec: Codec[ClaimLocalAnchorOutputTx] = (("inputInfo" | inputInfoCodec) :: ("tx" | txCodec)).as[ClaimLocalAnchorOutputTx] + val claimRemoteAnchorOutputTxCodec: Codec[ClaimRemoteAnchorOutputTx] = (("inputInfo" | inputInfoCodec) :: ("tx" | txCodec)).as[ClaimRemoteAnchorOutputTx] + val closingTxCodec: Codec[ClosingTx] = (("inputInfo" | inputInfoCodec) :: ("tx" | txCodec) :: ("outputIndex" | optional(bool8, outputInfoCodec))).as[ClosingTx] + + val txWithInputInfoCodec: Codec[TransactionWithInputInfo] = discriminated[TransactionWithInputInfo].by(uint16) + .typecase(0x01, commitTxCodec) + .typecase(0x02, htlcSuccessTxCodec) + .typecase(0x03, htlcTimeoutTxCodec) + .typecase(0x04, claimHtlcSuccessTxCodec) + .typecase(0x05, claimHtlcTimeoutTxCodec) + .typecase(0x06, claimP2WPKHOutputTxCodec) + .typecase(0x07, claimLocalDelayedOutputTxCodec) + .typecase(0x08, mainPenaltyTxCodec) + .typecase(0x09, htlcPenaltyTxCodec) + .typecase(0x10, closingTxCodec) + .typecase(0x11, claimLocalAnchorOutputTxCodec) + .typecase(0x12, claimRemoteAnchorOutputTxCodec) + .typecase(0x13, claimRemoteDelayedOutputTxCodec) + .typecase(0x14, claimHtlcDelayedOutputPenaltyTxCodec) + .typecase(0x15, htlcDelayedTxCodec) + + val claimRemoteCommitMainOutputTxCodec: Codec[ClaimRemoteCommitMainOutputTx] = discriminated[ClaimRemoteCommitMainOutputTx].by(uint8) + .typecase(0x01, claimP2WPKHOutputTxCodec) + .typecase(0x02, claimRemoteDelayedOutputTxCodec) + + val claimAnchorOutputTxCodec: Codec[ClaimAnchorOutputTx] = discriminated[ClaimAnchorOutputTx].by(uint8) + .typecase(0x01, claimLocalAnchorOutputTxCodec) + .typecase(0x02, claimRemoteAnchorOutputTxCodec) + + val htlcTxCodec: Codec[HtlcTx] = discriminated[HtlcTx].by(uint8) + .typecase(0x01, htlcSuccessTxCodec) + .typecase(0x02, htlcTimeoutTxCodec) + + val claimHtlcTxCodec: Codec[ClaimHtlcTx] = discriminated[ClaimHtlcTx].by(uint8) + .typecase(0x01, claimHtlcSuccessTxCodec) + .typecase(0x02, claimHtlcTimeoutTxCodec) + + val htlcTxsAndRemoteSigsCodec: Codec[HtlcTxAndRemoteSig] = ( + ("txinfo" | htlcTxCodec) :: + ("remoteSig" | bytes64)).as[HtlcTxAndRemoteSig] + + val commitTxAndRemoteSigCodec: Codec[CommitTxAndRemoteSig] = ( + ("commitTx" | commitTxCodec) :: + ("remoteSig" | bytes64)).as[CommitTxAndRemoteSig] + + val localCommitCodec: Codec[LocalCommit] = ( + ("index" | uint64overflow) :: + ("spec" | commitmentSpecCodec) :: + ("commitTxAndRemoteSig" | commitTxAndRemoteSigCodec) :: + ("htlcTxsAndRemoteSigs" | listOfN(uint16, htlcTxsAndRemoteSigsCodec))).as[LocalCommit] + + val remoteCommitCodec: Codec[RemoteCommit] = ( + ("index" | uint64overflow) :: + ("spec" | commitmentSpecCodec) :: + ("txid" | bytes32) :: + ("remotePerCommitmentPoint" | publicKey)).as[RemoteCommit] + + val updateMessageCodec: Codec[UpdateMessage] = lengthDelimited(lightningMessageCodec.narrow[UpdateMessage](f => Attempt.successful(f.asInstanceOf[UpdateMessage]), g => g)) + + val localChangesCodec: Codec[LocalChanges] = ( + ("proposed" | listOfN(uint16, updateMessageCodec)) :: + ("signed" | listOfN(uint16, updateMessageCodec)) :: + ("acked" | listOfN(uint16, updateMessageCodec))).as[LocalChanges] + + val remoteChangesCodec: Codec[RemoteChanges] = ( + ("proposed" | listOfN(uint16, updateMessageCodec)) :: + ("acked" | listOfN(uint16, updateMessageCodec)) :: + ("signed" | listOfN(uint16, updateMessageCodec))).as[RemoteChanges] + + val waitingForRevocationCodec: Codec[WaitingForRevocation] = ( + ("nextRemoteCommit" | remoteCommitCodec) :: + ("sent" | lengthDelimited(commitSigCodec)) :: + ("sentAfterLocalCommitIndex" | uint64overflow) :: + ("reSignAsap" | bool8)).as[WaitingForRevocation] + + val localColdCodec: Codec[Origin.LocalCold] = ("id" | uuid).as[Origin.LocalCold] + + val localCodec: Codec[Origin.Local] = localColdCodec.xmap[Origin.Local](o => o: Origin.Local, o => Origin.LocalCold(o.id)) + + val relayedColdCodec: Codec[Origin.ChannelRelayedCold] = ( + ("originChannelId" | bytes32) :: + ("originHtlcId" | int64) :: + ("amountIn" | millisatoshi) :: + ("amountOut" | millisatoshi)).as[Origin.ChannelRelayedCold] + + val relayedCodec: Codec[Origin.ChannelRelayed] = relayedColdCodec.xmap[Origin.ChannelRelayed](o => o: Origin.ChannelRelayed, o => Origin.ChannelRelayedCold(o.originChannelId, o.originHtlcId, o.amountIn, o.amountOut)) + + val trampolineRelayedColdCodec: Codec[Origin.TrampolineRelayedCold] = listOfN(uint16, bytes32 ~ int64).as[Origin.TrampolineRelayedCold] + + val trampolineRelayedCodec: Codec[Origin.TrampolineRelayed] = trampolineRelayedColdCodec.xmap[Origin.TrampolineRelayed](o => o: Origin.TrampolineRelayed, o => Origin.TrampolineRelayedCold(o.htlcs)) + + val originCodec: Codec[Origin] = discriminated[Origin].by(uint16) + .typecase(0x02, relayedCodec) + .typecase(0x03, localCodec) + .typecase(0x04, trampolineRelayedCodec) + + def mapCodec[K, V](keyCodec: Codec[K], valueCodec: Codec[V]): Codec[Map[K, V]] = listOfN(uint16, keyCodec ~ valueCodec).xmap(_.toMap, _.toList) + + val originsMapCodec: Codec[Map[Long, Origin]] = mapCodec(int64, originCodec) + + val spentMapCodec: Codec[Map[OutPoint, Transaction]] = mapCodec(outPointCodec, txCodec) + + val commitmentsCodec: Codec[Commitments] = ( + ("channelVersion" | channelVersionCodec) >>:~ { channelVersion => + ("localParams" | localParamsCodec(channelVersion)) :: + ("remoteParams" | remoteParamsCodec) :: + ("channelFlags" | byte) :: + ("localCommit" | localCommitCodec) :: + ("remoteCommit" | remoteCommitCodec) :: + ("localChanges" | localChangesCodec) :: + ("remoteChanges" | remoteChangesCodec) :: + ("localNextHtlcId" | uint64overflow) :: + ("remoteNextHtlcId" | uint64overflow) :: + ("originChannels" | originsMapCodec) :: + ("remoteNextCommitInfo" | either(bool8, waitingForRevocationCodec, publicKey)) :: + ("commitInput" | inputInfoCodec) :: + ("remotePerCommitmentSecrets" | byteAligned(ShaChain.shaChainCodec)) :: + ("channelId" | bytes32) + }).as[Commitments] + + val closingTxProposedCodec: Codec[ClosingTxProposed] = ( + ("unsignedTx" | closingTxCodec) :: + ("localClosingSigned" | lengthDelimited(closingSignedCodec))).as[ClosingTxProposed] + + val localCommitPublishedCodec: Codec[LocalCommitPublished] = ( + ("commitTx" | txCodec) :: + ("claimMainDelayedOutputTx" | optional(bool8, claimLocalDelayedOutputTxCodec)) :: + ("htlcTxs" | mapCodec(outPointCodec, optional(bool8, htlcTxCodec))) :: + ("claimHtlcDelayedTx" | listOfN(uint16, htlcDelayedTxCodec)) :: + ("claimAnchorTxs" | listOfN(uint16, claimAnchorOutputTxCodec)) :: + ("spent" | spentMapCodec)).as[LocalCommitPublished] + + val remoteCommitPublishedCodec: Codec[RemoteCommitPublished] = ( + ("commitTx" | txCodec) :: + ("claimMainOutputTx" | optional(bool8, claimRemoteCommitMainOutputTxCodec)) :: + ("claimHtlcTxs" | mapCodec(outPointCodec, optional(bool8, claimHtlcTxCodec))) :: + ("claimAnchorTxs" | listOfN(uint16, claimAnchorOutputTxCodec)) :: + ("spent" | spentMapCodec)).as[RemoteCommitPublished] + + val revokedCommitPublishedCodec: Codec[RevokedCommitPublished] = ( + ("commitTx" | txCodec) :: + ("claimMainOutputTx" | optional(bool8, claimRemoteCommitMainOutputTxCodec)) :: + ("mainPenaltyTx" | optional(bool8, mainPenaltyTxCodec)) :: + ("htlcPenaltyTxs" | listOfN(uint16, htlcPenaltyTxCodec)) :: + ("claimHtlcDelayedPenaltyTxs" | listOfN(uint16, claimHtlcDelayedOutputPenaltyTxCodec)) :: + ("spent" | spentMapCodec)).as[RevokedCommitPublished] + + val DATA_WAIT_FOR_FUNDING_CONFIRMED_Codec: Codec[DATA_WAIT_FOR_FUNDING_CONFIRMED] = ( + ("commitments" | commitmentsCodec) :: + ("fundingTx" | optional(bool8, txCodec)) :: + ("initialRelayFees" | provide(Option.empty[(MilliSatoshi, Int)])) :: + ("waitingSince" | int64) :: + ("deferred" | optional(bool8, lengthDelimited(fundingLockedCodec))) :: + ("lastSent" | either(bool8, lengthDelimited(fundingCreatedCodec), lengthDelimited(fundingSignedCodec)))).as[DATA_WAIT_FOR_FUNDING_CONFIRMED] + + val DATA_WAIT_FOR_FUNDING_LOCKED_Codec: Codec[DATA_WAIT_FOR_FUNDING_LOCKED] = ( + ("commitments" | commitmentsCodec) :: + ("shortChannelId" | shortchannelid) :: + ("lastSent" | lengthDelimited(fundingLockedCodec)) :: + ("initialRelayFees" | provide(Option.empty[(MilliSatoshi, Int)]))).as[DATA_WAIT_FOR_FUNDING_LOCKED] + + val DATA_NORMAL_Codec: Codec[DATA_NORMAL] = ( + ("commitments" | commitmentsCodec) :: + ("shortChannelId" | shortchannelid) :: + ("buried" | bool8) :: + ("channelAnnouncement" | optional(bool8, lengthDelimited(channelAnnouncementCodec))) :: + ("channelUpdate" | lengthDelimited(channelUpdateCodec)) :: + ("localShutdown" | optional(bool8, lengthDelimited(shutdownCodec))) :: + ("remoteShutdown" | optional(bool8, lengthDelimited(shutdownCodec)))).as[DATA_NORMAL] + + val DATA_SHUTDOWN_Codec: Codec[DATA_SHUTDOWN] = ( + ("commitments" | commitmentsCodec) :: + ("localShutdown" | lengthDelimited(shutdownCodec)) :: + ("remoteShutdown" | lengthDelimited(shutdownCodec))).as[DATA_SHUTDOWN] + + val DATA_NEGOTIATING_Codec: Codec[DATA_NEGOTIATING] = ( + ("commitments" | commitmentsCodec) :: + ("localShutdown" | lengthDelimited(shutdownCodec)) :: + ("remoteShutdown" | lengthDelimited(shutdownCodec)) :: + ("closingTxProposed" | listOfN(uint16, listOfN(uint16, lengthDelimited(closingTxProposedCodec)))) :: + ("bestUnpublishedClosingTx_opt" | optional(bool8, closingTxCodec))).as[DATA_NEGOTIATING] + + val DATA_CLOSING_Codec: Codec[DATA_CLOSING] = ( + ("commitments" | commitmentsCodec) :: + ("fundingTx" | optional(bool8, txCodec)) :: + ("waitingSince" | int64) :: + ("mutualCloseProposed" | listOfN(uint16, closingTxCodec)) :: + ("mutualClosePublished" | listOfN(uint16, closingTxCodec)) :: + ("localCommitPublished" | optional(bool8, localCommitPublishedCodec)) :: + ("remoteCommitPublished" | optional(bool8, remoteCommitPublishedCodec)) :: + ("nextRemoteCommitPublished" | optional(bool8, remoteCommitPublishedCodec)) :: + ("futureRemoteCommitPublished" | optional(bool8, remoteCommitPublishedCodec)) :: + ("revokedCommitPublished" | listOfN(uint16, revokedCommitPublishedCodec))).as[DATA_CLOSING] + + val DATA_WAIT_FOR_REMOTE_PUBLISH_FUTURE_COMMITMENT_Codec: Codec[DATA_WAIT_FOR_REMOTE_PUBLISH_FUTURE_COMMITMENT] = ( + ("commitments" | commitmentsCodec) :: + ("remoteChannelReestablish" | channelReestablishCodec)).as[DATA_WAIT_FOR_REMOTE_PUBLISH_FUTURE_COMMITMENT] + } + + val stateDataCodec: Codec[HasCommitments] = discriminated[HasCommitments].by(uint16) + .typecase(0x00, Codecs.DATA_WAIT_FOR_FUNDING_CONFIRMED_Codec) + .typecase(0x01, Codecs.DATA_WAIT_FOR_FUNDING_LOCKED_Codec) + .typecase(0x02, Codecs.DATA_NORMAL_Codec) + .typecase(0x03, Codecs.DATA_SHUTDOWN_Codec) + .typecase(0x04, Codecs.DATA_NEGOTIATING_Codec) + .typecase(0x05, Codecs.DATA_CLOSING_Codec) + .typecase(0x06, Codecs.DATA_WAIT_FOR_REMOTE_PUBLISH_FUTURE_COMMITMENT_Codec) + +} diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/channel/ChannelTypesSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/channel/ChannelTypesSpec.scala index b8a34492be..8558ae5b9c 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/channel/ChannelTypesSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/channel/ChannelTypesSpec.scala @@ -479,7 +479,7 @@ class ChannelTypesSpec extends TestKitBaseClass with AnyFunSuiteLike with StateT addHtlc(18_000_000 msat, bob, alice, bob2alice, alice2bob) addHtlc(400_000 msat, bob, alice, bob2alice, alice2bob) // below dust crossSign(bob, alice, bob2alice, alice2bob) - val revokedCommitTx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val revokedCommitTx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx fulfillHtlc(htlca1.id, ra1, bob, alice, bob2alice, alice2bob) crossSign(bob, alice, bob2alice, alice2bob) diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/channel/CommitmentsSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/channel/CommitmentsSpec.scala index 05d6d72a70..8c5e294216 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/channel/CommitmentsSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/channel/CommitmentsSpec.scala @@ -17,7 +17,7 @@ package fr.acinq.eclair.channel import fr.acinq.bitcoin.Crypto.PublicKey -import fr.acinq.bitcoin.{DeterministicWallet, Satoshi, SatoshiLong, Transaction} +import fr.acinq.bitcoin.{ByteVector64, DeterministicWallet, Satoshi, SatoshiLong, Transaction} import fr.acinq.eclair.TestConstants.TestFeeEstimator import fr.acinq.eclair.blockchain.fee.{FeeTargets, FeeratePerKw, FeerateTolerance, OnChainFeeConf} import fr.acinq.eclair.channel.Commitments._ @@ -473,7 +473,7 @@ object CommitmentsSpec { localParams, remoteParams, channelFlags = if (announceChannel) ChannelFlags.AnnounceChannel else ChannelFlags.Empty, - LocalCommit(0, CommitmentSpec(Set.empty, feeRatePerKw, toLocal, toRemote), PublishableTxs(CommitTx(commitmentInput, Transaction(2, Nil, Nil, 0)), Nil)), + LocalCommit(0, CommitmentSpec(Set.empty, feeRatePerKw, toLocal, toRemote), CommitTxAndRemoteSig(CommitTx(commitmentInput, Transaction(2, Nil, Nil, 0)), ByteVector64.Zeroes), Nil), RemoteCommit(0, CommitmentSpec(Set.empty, feeRatePerKw, toRemote, toLocal), randomBytes32(), randomKey().publicKey), LocalChanges(Nil, Nil, Nil), RemoteChanges(Nil, Nil, Nil), @@ -495,7 +495,7 @@ object CommitmentsSpec { localParams, remoteParams, channelFlags = if (announceChannel) ChannelFlags.AnnounceChannel else ChannelFlags.Empty, - LocalCommit(0, CommitmentSpec(Set.empty, FeeratePerKw(0 sat), toLocal, toRemote), PublishableTxs(CommitTx(commitmentInput, Transaction(2, Nil, Nil, 0)), Nil)), + LocalCommit(0, CommitmentSpec(Set.empty, FeeratePerKw(0 sat), toLocal, toRemote), CommitTxAndRemoteSig(CommitTx(commitmentInput, Transaction(2, Nil, Nil, 0)), ByteVector64.Zeroes), Nil), RemoteCommit(0, CommitmentSpec(Set.empty, FeeratePerKw(0 sat), toRemote, toLocal), randomBytes32(), randomKey().publicKey), LocalChanges(Nil, Nil, Nil), RemoteChanges(Nil, Nil, Nil), diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/channel/RecoverySpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/channel/RecoverySpec.scala index f2df768360..f40bc77a85 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/channel/RecoverySpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/channel/RecoverySpec.scala @@ -81,7 +81,7 @@ class RecoverySpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with Sta awaitCond(alice.stateName == WAIT_FOR_REMOTE_PUBLISH_FUTURE_COMMITMENT) // bob is nice and publishes its commitment - val bobCommitTx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val bobCommitTx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.fullySignedLocalCommitTx(bob.underlyingActor.nodeParams.channelKeyManager).tx // actual tests starts here: let's see what we can do with Bob's commit tx sender.send(alice, WatchFundingSpentTriggered(bobCommitTx)) diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/channel/publish/ReplaceableTxPublisherSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/channel/publish/ReplaceableTxPublisherSpec.scala index 26d5285251..5735170cb4 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/channel/publish/ReplaceableTxPublisherSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/channel/publish/ReplaceableTxPublisherSpec.scala @@ -129,7 +129,7 @@ class ReplaceableTxPublisherSpec extends TestKitBaseClass with AnyFunSuiteLike w def closeChannelWithoutHtlcs(f: Fixture): (PublishRawTx, PublishReplaceableTx) = { import f._ - val commitTx = alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx + val commitTx = alice.stateData.asInstanceOf[DATA_NORMAL].commitments.fullySignedLocalCommitTx(alice.underlyingActor.nodeParams.channelKeyManager) probe.send(alice, CMD_FORCECLOSE(probe.ref)) probe.expectMsgType[CommandSuccess[CMD_FORCECLOSE]] @@ -177,7 +177,7 @@ class ReplaceableTxPublisherSpec extends TestKitBaseClass with AnyFunSuiteLike w withFixture(Seq(500 millibtc), f => { import f._ - val remoteCommit = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx + val remoteCommit = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.fullySignedLocalCommitTx(bob.underlyingActor.nodeParams.channelKeyManager) val (_, anchorTx) = closeChannelWithoutHtlcs(f) walletClient.publishTransaction(remoteCommit.tx).pipeTo(probe.ref) probe.expectMsg(remoteCommit.tx.txid) @@ -194,7 +194,7 @@ class ReplaceableTxPublisherSpec extends TestKitBaseClass with AnyFunSuiteLike w withFixture(Seq(500 millibtc), f => { import f._ - val remoteCommit = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx + val remoteCommit = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.fullySignedLocalCommitTx(bob.underlyingActor.nodeParams.channelKeyManager) val (_, anchorTx) = closeChannelWithoutHtlcs(f) walletClient.publishTransaction(remoteCommit.tx).pipeTo(probe.ref) probe.expectMsg(remoteCommit.tx.txid) @@ -411,7 +411,7 @@ class ReplaceableTxPublisherSpec extends TestKitBaseClass with AnyFunSuiteLike w probe.expectMsgType[CommandSuccess[CMD_FULFILL_HTLC]] // Force-close channel and verify txs sent to watcher. - val commitTx = alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx + val commitTx = alice.stateData.asInstanceOf[DATA_NORMAL].commitments.fullySignedLocalCommitTx(alice.underlyingActor.nodeParams.channelKeyManager) assert(commitTx.tx.txOut.size === 6) probe.send(alice, CMD_FORCECLOSE(probe.ref)) probe.expectMsgType[CommandSuccess[CMD_FORCECLOSE]] diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/StateTestsHelperMethods.scala b/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/StateTestsHelperMethods.scala index f05644e0e7..2ab1775687 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/StateTestsHelperMethods.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/StateTestsHelperMethods.scala @@ -281,14 +281,22 @@ trait StateTestsHelperMethods extends TestKitBase { def localClose(s: TestFSMRef[State, Data, Channel], s2blockchain: TestProbe): LocalCommitPublished = { // an error occurs and s publishes its commit tx - val commitTx = s.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val localCommit = s.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit + // check that we store the local txs without sigs + localCommit.commitTxAndRemoteSig.commitTx.tx.txIn.foreach(txIn => assert(txIn.witness.isNull)) + localCommit.htlcTxsAndRemoteSigs.foreach(_.htlcTx.tx.txIn.foreach(txIn => assert(txIn.witness.isNull))) + + val commitTx = localCommit.commitTxAndRemoteSig.commitTx.tx s ! Error(ByteVector32.Zeroes, "oops") awaitCond(s.stateName == CLOSING) val closingState = s.stateData.asInstanceOf[DATA_CLOSING] assert(closingState.localCommitPublished.isDefined) val localCommitPublished = closingState.localCommitPublished.get - assert(s2blockchain.expectMsgType[TxPublisher.PublishRawTx].tx == commitTx) + val publishedLocalCommitTx = s2blockchain.expectMsgType[TxPublisher.PublishRawTx].tx + assert(publishedLocalCommitTx.txid == commitTx.txid) + val commitInput = closingState.commitments.commitInput + Transaction.correctlySpends(publishedLocalCommitTx, Map(commitInput.outPoint -> commitInput.txOut), ScriptFlags.STANDARD_SCRIPT_VERIFY_FLAGS) if (closingState.commitments.commitmentFormat == Transactions.AnchorOutputsCommitmentFormat) { assert(s2blockchain.expectMsgType[TxPublisher.PublishReplaceableTx].txInfo.isInstanceOf[ClaimLocalAnchorOutputTx]) } diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/c/WaitForFundingConfirmedStateSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/c/WaitForFundingConfirmedStateSpec.scala index cb9569edb3..f96300bd3f 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/c/WaitForFundingConfirmedStateSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/c/WaitForFundingConfirmedStateSpec.scala @@ -164,7 +164,7 @@ class WaitForFundingConfirmedStateSpec extends TestKitBaseClass with FixtureAnyF test("recv WatchFundingSpentTriggered (remote commit)") { f => import f._ // bob publishes his commitment tx - val tx = bob.stateData.asInstanceOf[DATA_WAIT_FOR_FUNDING_CONFIRMED].commitments.localCommit.publishableTxs.commitTx.tx + val tx = bob.stateData.asInstanceOf[DATA_WAIT_FOR_FUNDING_CONFIRMED].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx alice ! WatchFundingSpentTriggered(tx) alice2blockchain.expectMsgType[TxPublisher.PublishTx] assert(alice2blockchain.expectMsgType[WatchTxConfirmed].txId === tx.txid) @@ -173,19 +173,19 @@ class WaitForFundingConfirmedStateSpec extends TestKitBaseClass with FixtureAnyF test("recv WatchFundingSpentTriggered (other commit)") { f => import f._ - val tx = alice.stateData.asInstanceOf[DATA_WAIT_FOR_FUNDING_CONFIRMED].commitments.localCommit.publishableTxs.commitTx.tx + val tx = alice.stateData.asInstanceOf[DATA_WAIT_FOR_FUNDING_CONFIRMED].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx alice ! WatchFundingSpentTriggered(Transaction(0, Nil, Nil, 0)) alice2bob.expectMsgType[Error] - assert(alice2blockchain.expectMsgType[TxPublisher.PublishRawTx].tx === tx) + assert(alice2blockchain.expectMsgType[TxPublisher.PublishRawTx].tx.txid === tx.txid) awaitCond(alice.stateName == ERR_INFORMATION_LEAK) } test("recv Error") { f => import f._ - val tx = alice.stateData.asInstanceOf[DATA_WAIT_FOR_FUNDING_CONFIRMED].commitments.localCommit.publishableTxs.commitTx.tx + val tx = alice.stateData.asInstanceOf[DATA_WAIT_FOR_FUNDING_CONFIRMED].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx alice ! Error(ByteVector32.Zeroes, "oops") awaitCond(alice.stateName == CLOSING) - assert(alice2blockchain.expectMsgType[TxPublisher.PublishRawTx].tx === tx) + assert(alice2blockchain.expectMsgType[TxPublisher.PublishRawTx].tx.txid === tx.txid) alice2blockchain.expectMsgType[TxPublisher.PublishTx] // claim-main-delayed assert(alice2blockchain.expectMsgType[WatchTxConfirmed].txId === tx.txid) } @@ -201,10 +201,10 @@ class WaitForFundingConfirmedStateSpec extends TestKitBaseClass with FixtureAnyF test("recv CMD_FORCECLOSE") { f => import f._ val sender = TestProbe() - val tx = alice.stateData.asInstanceOf[DATA_WAIT_FOR_FUNDING_CONFIRMED].commitments.localCommit.publishableTxs.commitTx.tx + val tx = alice.stateData.asInstanceOf[DATA_WAIT_FOR_FUNDING_CONFIRMED].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx alice ! CMD_FORCECLOSE(sender.ref) awaitCond(alice.stateName == CLOSING) - assert(alice2blockchain.expectMsgType[TxPublisher.PublishRawTx].tx === tx) + assert(alice2blockchain.expectMsgType[TxPublisher.PublishRawTx].tx.txid === tx.txid) alice2blockchain.expectMsgType[TxPublisher.PublishTx] // claim-main-delayed assert(alice2blockchain.expectMsgType[WatchTxConfirmed].txId === tx.txid) } diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/c/WaitForFundingLockedStateSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/c/WaitForFundingLockedStateSpec.scala index a3e662966d..c6832a9bf1 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/c/WaitForFundingLockedStateSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/c/WaitForFundingLockedStateSpec.scala @@ -92,7 +92,7 @@ class WaitForFundingLockedStateSpec extends TestKitBaseClass with FixtureAnyFunS test("recv WatchFundingSpentTriggered (remote commit)") { f => import f._ // bob publishes his commitment tx - val tx = bob.stateData.asInstanceOf[DATA_WAIT_FOR_FUNDING_LOCKED].commitments.localCommit.publishableTxs.commitTx.tx + val tx = bob.stateData.asInstanceOf[DATA_WAIT_FOR_FUNDING_LOCKED].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx alice ! WatchFundingSpentTriggered(tx) alice2blockchain.expectMsgType[TxPublisher.PublishTx] assert(alice2blockchain.expectMsgType[WatchTxConfirmed].txId === tx.txid) @@ -101,20 +101,20 @@ class WaitForFundingLockedStateSpec extends TestKitBaseClass with FixtureAnyFunS test("recv WatchFundingSpentTriggered (other commit)") { f => import f._ - val tx = alice.stateData.asInstanceOf[DATA_WAIT_FOR_FUNDING_LOCKED].commitments.localCommit.publishableTxs.commitTx.tx + val tx = alice.stateData.asInstanceOf[DATA_WAIT_FOR_FUNDING_LOCKED].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx alice ! WatchFundingSpentTriggered(Transaction(0, Nil, Nil, 0)) alice2bob.expectMsgType[Error] - assert(alice2blockchain.expectMsgType[TxPublisher.PublishRawTx].tx === tx) + assert(alice2blockchain.expectMsgType[TxPublisher.PublishRawTx].tx.txid === tx.txid) alice2blockchain.expectMsgType[TxPublisher.PublishTx] awaitCond(alice.stateName == ERR_INFORMATION_LEAK) } test("recv Error") { f => import f._ - val tx = alice.stateData.asInstanceOf[DATA_WAIT_FOR_FUNDING_LOCKED].commitments.localCommit.publishableTxs.commitTx.tx + val tx = alice.stateData.asInstanceOf[DATA_WAIT_FOR_FUNDING_LOCKED].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx alice ! Error(ByteVector32.Zeroes, "oops") awaitCond(alice.stateName == CLOSING) - assert(alice2blockchain.expectMsgType[TxPublisher.PublishRawTx].tx === tx) + assert(alice2blockchain.expectMsgType[TxPublisher.PublishRawTx].tx.txid === tx.txid) alice2blockchain.expectMsgType[TxPublisher.PublishTx] assert(alice2blockchain.expectMsgType[WatchTxConfirmed].txId === tx.txid) } @@ -130,10 +130,10 @@ class WaitForFundingLockedStateSpec extends TestKitBaseClass with FixtureAnyFunS test("recv CMD_FORCECLOSE") { f => import f._ val sender = TestProbe() - val tx = alice.stateData.asInstanceOf[DATA_WAIT_FOR_FUNDING_LOCKED].commitments.localCommit.publishableTxs.commitTx.tx + val tx = alice.stateData.asInstanceOf[DATA_WAIT_FOR_FUNDING_LOCKED].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx alice ! CMD_FORCECLOSE(sender.ref) awaitCond(alice.stateName == CLOSING) - assert(alice2blockchain.expectMsgType[TxPublisher.PublishRawTx].tx === tx) + assert(alice2blockchain.expectMsgType[TxPublisher.PublishRawTx].tx.txid === tx.txid) alice2blockchain.expectMsgType[TxPublisher.PublishTx] assert(alice2blockchain.expectMsgType[WatchTxConfirmed].txId === tx.txid) } diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/e/NormalStateSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/e/NormalStateSpec.scala index 3b6802cf00..edc0fdf18d 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/e/NormalStateSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/e/NormalStateSpec.scala @@ -470,7 +470,7 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with test("recv UpdateAddHtlc (unexpected id)") { f => import f._ - val tx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val tx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx val htlc = UpdateAddHtlc(ByteVector32.Zeroes, 42, 150000 msat, randomBytes32(), CltvExpiryDelta(144).toCltvExpiry(currentBlockHeight), TestConstants.emptyOnionPacket) bob ! htlc.copy(id = 0) bob ! htlc.copy(id = 1) @@ -480,14 +480,14 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with val error = bob2alice.expectMsgType[Error] assert(new String(error.data.toArray) === UnexpectedHtlcId(channelId(bob), expected = 4, actual = 42).getMessage) awaitCond(bob.stateName == CLOSING) - assert(bob2blockchain.expectMsgType[PublishRawTx].tx === tx) + assert(bob2blockchain.expectMsgType[PublishRawTx].tx.txid === tx.txid) bob2blockchain.expectMsgType[PublishTx] bob2blockchain.expectMsgType[WatchTxConfirmed] } test("recv UpdateAddHtlc (value too small)") { f => import f._ - val tx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val tx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx val htlc = UpdateAddHtlc(ByteVector32.Zeroes, 0, 150 msat, randomBytes32(), cltvExpiry = CltvExpiryDelta(144).toCltvExpiry(currentBlockHeight), TestConstants.emptyOnionPacket) alice2bob.forward(bob, htlc) val error = bob2alice.expectMsgType[Error] @@ -495,14 +495,14 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with awaitCond(bob.stateName == CLOSING) // channel should be advertised as down assert(channelUpdateListener.expectMsgType[LocalChannelDown].channelId === bob.stateData.asInstanceOf[DATA_CLOSING].channelId) - assert(bob2blockchain.expectMsgType[PublishRawTx].tx === tx) + assert(bob2blockchain.expectMsgType[PublishRawTx].tx.txid === tx.txid) bob2blockchain.expectMsgType[PublishTx] bob2blockchain.expectMsgType[WatchTxConfirmed] } test("recv UpdateAddHtlc (insufficient funds)") { f => import f._ - val tx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val tx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx val htlc = UpdateAddHtlc(ByteVector32.Zeroes, 0, MilliSatoshi(Long.MaxValue), randomBytes32(), CltvExpiryDelta(144).toCltvExpiry(currentBlockHeight), TestConstants.emptyOnionPacket) alice2bob.forward(bob, htlc) val error = bob2alice.expectMsgType[Error] @@ -510,14 +510,14 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with awaitCond(bob.stateName == CLOSING) // channel should be advertised as down assert(channelUpdateListener.expectMsgType[LocalChannelDown].channelId === bob.stateData.asInstanceOf[DATA_CLOSING].channelId) - assert(bob2blockchain.expectMsgType[PublishRawTx].tx === tx) + assert(bob2blockchain.expectMsgType[PublishRawTx].tx.txid === tx.txid) bob2blockchain.expectMsgType[PublishTx] bob2blockchain.expectMsgType[WatchTxConfirmed] } test("recv UpdateAddHtlc (insufficient funds w/ pending htlcs) (anchor outputs)", Tag(StateTestsTags.AnchorOutputs)) { f => import f._ - val tx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val tx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx alice2bob.forward(bob, UpdateAddHtlc(ByteVector32.Zeroes, 0, 400000000 msat, randomBytes32(), CltvExpiryDelta(144).toCltvExpiry(currentBlockHeight), TestConstants.emptyOnionPacket)) alice2bob.forward(bob, UpdateAddHtlc(ByteVector32.Zeroes, 1, 300000000 msat, randomBytes32(), CltvExpiryDelta(144).toCltvExpiry(currentBlockHeight), TestConstants.emptyOnionPacket)) alice2bob.forward(bob, UpdateAddHtlc(ByteVector32.Zeroes, 2, 100000000 msat, randomBytes32(), CltvExpiryDelta(144).toCltvExpiry(currentBlockHeight), TestConstants.emptyOnionPacket)) @@ -526,12 +526,12 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with awaitCond(bob.stateName == CLOSING) // channel should be advertised as down assert(channelUpdateListener.expectMsgType[LocalChannelDown].channelId === bob.stateData.asInstanceOf[DATA_CLOSING].channelId) - assert(bob2blockchain.expectMsgType[PublishRawTx].tx === tx) + assert(bob2blockchain.expectMsgType[PublishRawTx].tx.txid === tx.txid) } test("recv UpdateAddHtlc (insufficient funds w/ pending htlcs 1/2)") { f => import f._ - val tx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val tx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx alice2bob.forward(bob, UpdateAddHtlc(ByteVector32.Zeroes, 0, 400000000 msat, randomBytes32(), CltvExpiryDelta(144).toCltvExpiry(currentBlockHeight), TestConstants.emptyOnionPacket)) alice2bob.forward(bob, UpdateAddHtlc(ByteVector32.Zeroes, 1, 200000000 msat, randomBytes32(), CltvExpiryDelta(144).toCltvExpiry(currentBlockHeight), TestConstants.emptyOnionPacket)) alice2bob.forward(bob, UpdateAddHtlc(ByteVector32.Zeroes, 2, 167600000 msat, randomBytes32(), CltvExpiryDelta(144).toCltvExpiry(currentBlockHeight), TestConstants.emptyOnionPacket)) @@ -541,14 +541,14 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with awaitCond(bob.stateName == CLOSING) // channel should be advertised as down assert(channelUpdateListener.expectMsgType[LocalChannelDown].channelId === bob.stateData.asInstanceOf[DATA_CLOSING].channelId) - assert(bob2blockchain.expectMsgType[PublishRawTx].tx === tx) + assert(bob2blockchain.expectMsgType[PublishRawTx].tx.txid === tx.txid) bob2blockchain.expectMsgType[PublishTx] bob2blockchain.expectMsgType[WatchTxConfirmed] } test("recv UpdateAddHtlc (insufficient funds w/ pending htlcs 2/2)") { f => import f._ - val tx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val tx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx alice2bob.forward(bob, UpdateAddHtlc(ByteVector32.Zeroes, 0, 300000000 msat, randomBytes32(), CltvExpiryDelta(144).toCltvExpiry(currentBlockHeight), TestConstants.emptyOnionPacket)) alice2bob.forward(bob, UpdateAddHtlc(ByteVector32.Zeroes, 1, 300000000 msat, randomBytes32(), CltvExpiryDelta(144).toCltvExpiry(currentBlockHeight), TestConstants.emptyOnionPacket)) alice2bob.forward(bob, UpdateAddHtlc(ByteVector32.Zeroes, 2, 500000000 msat, randomBytes32(), CltvExpiryDelta(144).toCltvExpiry(currentBlockHeight), TestConstants.emptyOnionPacket)) @@ -557,28 +557,28 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with awaitCond(bob.stateName == CLOSING) // channel should be advertised as down assert(channelUpdateListener.expectMsgType[LocalChannelDown].channelId === bob.stateData.asInstanceOf[DATA_CLOSING].channelId) - assert(bob2blockchain.expectMsgType[PublishRawTx].tx === tx) + assert(bob2blockchain.expectMsgType[PublishRawTx].tx.txid === tx.txid) bob2blockchain.expectMsgType[PublishTx] bob2blockchain.expectMsgType[WatchTxConfirmed] } test("recv UpdateAddHtlc (over max inflight htlc value)", Tag(StateTestsTags.AliceLowMaxHtlcValueInFlight)) { f => import f._ - val tx = alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val tx = alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx alice2bob.forward(alice, UpdateAddHtlc(ByteVector32.Zeroes, 0, 151000000 msat, randomBytes32(), CltvExpiryDelta(144).toCltvExpiry(currentBlockHeight), TestConstants.emptyOnionPacket)) val error = alice2bob.expectMsgType[Error] assert(new String(error.data.toArray) === HtlcValueTooHighInFlight(channelId(alice), maximum = 150000000, actual = 151000000 msat).getMessage) awaitCond(alice.stateName == CLOSING) // channel should be advertised as down assert(channelUpdateListener.expectMsgType[LocalChannelDown].channelId === alice.stateData.asInstanceOf[DATA_CLOSING].channelId) - assert(alice2blockchain.expectMsgType[PublishRawTx].tx === tx) + assert(alice2blockchain.expectMsgType[PublishRawTx].tx.txid === tx.txid) alice2blockchain.expectMsgType[PublishTx] alice2blockchain.expectMsgType[WatchTxConfirmed] } test("recv UpdateAddHtlc (over max accepted htlcs)") { f => import f._ - val tx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val tx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx // Bob accepts a maximum of 30 htlcs for (i <- 0 until 30) { alice2bob.forward(bob, UpdateAddHtlc(ByteVector32.Zeroes, i, 1000000 msat, randomBytes32(), CltvExpiryDelta(144).toCltvExpiry(currentBlockHeight), TestConstants.emptyOnionPacket)) @@ -589,7 +589,7 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with awaitCond(bob.stateName == CLOSING) // channel should be advertised as down assert(channelUpdateListener.expectMsgType[LocalChannelDown].channelId === bob.stateData.asInstanceOf[DATA_CLOSING].channelId) - assert(bob2blockchain.expectMsgType[PublishRawTx].tx === tx) + assert(bob2blockchain.expectMsgType[PublishRawTx].tx.txid === tx.txid) bob2blockchain.expectMsgType[PublishTx] bob2blockchain.expectMsgType[WatchTxConfirmed] } @@ -698,9 +698,9 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with val commitSig = alice2bob.expectMsgType[CommitSig] assert(commitSig.htlcSignatures.toSet.size == htlcCount) alice2bob.forward(bob) - awaitCond(bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.htlcTxsAndSigs.size == htlcCount) - val htlcTxs = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.htlcTxsAndSigs - val amounts = htlcTxs.map(_.txinfo.tx.txOut.head.amount.toLong) + awaitCond(bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.htlcTxsAndRemoteSigs.size == htlcCount) + val htlcTxs = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.htlcTxsAndRemoteSigs + val amounts = htlcTxs.map(_.htlcTx.tx.txOut.head.amount.toLong) assert(amounts === amounts.sorted) } @@ -798,7 +798,7 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with bob2alice.expectMsgType[CommitSig] awaitCond(bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.spec.htlcs.collect(incoming).exists(_.id == htlc.id)) - assert(bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.htlcTxsAndSigs.size == 1) + assert(bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.htlcTxsAndRemoteSigs.size == 1) assert(bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.spec.toLocal == initialState.commitments.localCommit.spec.toLocal) assert(bob.stateData.asInstanceOf[DATA_NORMAL].commitments.remoteChanges.acked.size == 0) assert(bob.stateData.asInstanceOf[DATA_NORMAL].commitments.remoteChanges.signed.size == 1) @@ -821,7 +821,7 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with bob2alice.forward(alice) awaitCond(alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.spec.htlcs.collect(outgoing).exists(_.id == htlc.id)) - assert(alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.htlcTxsAndSigs.size == 1) + assert(alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.htlcTxsAndRemoteSigs.size == 1) assert(bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.spec.toLocal == initialState.commitments.localCommit.spec.toLocal) } @@ -847,7 +847,7 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with bob2alice.forward(alice) awaitCond(alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.index == 1) - assert(alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.htlcTxsAndSigs.size == 3) + assert(alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.htlcTxsAndRemoteSigs.size == 3) } test("recv CommitSig (only fee update)") { f => @@ -888,14 +888,14 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with crossSign(alice, bob, alice2bob, bob2alice) awaitCond(bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.spec.htlcs.collect(incoming).exists(_.id == htlc1.id)) - assert(bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.htlcTxsAndSigs.size == 2) + assert(bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.htlcTxsAndRemoteSigs.size == 2) assert(bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.spec.toLocal == initialState.commitments.localCommit.spec.toLocal) - assert(bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx.txOut.count(_.amount == 50000.sat) == 2) + assert(bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx.txOut.count(_.amount == 50000.sat) == 2) } ignore("recv CommitSig (no changes)") { f => import f._ - val tx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val tx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx // signature is invalid but it doesn't matter bob ! CommitSig(ByteVector32.Zeroes, ByteVector64.Zeroes, Nil) val error = bob2alice.expectMsgType[Error] @@ -903,7 +903,7 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with awaitCond(bob.stateName == CLOSING) // channel should be advertised as down assert(channelUpdateListener.expectMsgType[LocalChannelDown].channelId === bob.stateData.asInstanceOf[DATA_CLOSING].channelId) - assert(bob2blockchain.expectMsgType[PublishRawTx].tx === tx) + assert(bob2blockchain.expectMsgType[PublishRawTx].tx.txid === tx.txid) bob2blockchain.expectMsgType[PublishTx] bob2blockchain.expectMsgType[WatchTxConfirmed] } @@ -911,14 +911,14 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with test("recv CommitSig (invalid signature)") { f => import f._ addHtlc(50000000 msat, alice, bob, alice2bob, bob2alice) - val tx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val tx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx // actual test begins bob ! CommitSig(ByteVector32.Zeroes, ByteVector64.Zeroes, Nil) val error = bob2alice.expectMsgType[Error] assert(new String(error.data.toArray).startsWith("invalid commitment signature")) awaitCond(bob.stateName == CLOSING) - assert(bob2blockchain.expectMsgType[PublishRawTx].tx === tx) + assert(bob2blockchain.expectMsgType[PublishRawTx].tx.txid === tx.txid) bob2blockchain.expectMsgType[PublishTx] bob2blockchain.expectMsgType[WatchTxConfirmed] } @@ -927,7 +927,7 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with import f._ addHtlc(50000000 msat, alice, bob, alice2bob, bob2alice) - val tx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val tx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx alice ! CMD_SIGN() val commitSig = alice2bob.expectMsgType[CommitSig] @@ -937,7 +937,7 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with bob ! badCommitSig val error = bob2alice.expectMsgType[Error] assert(new String(error.data.toArray) === HtlcSigCountMismatch(channelId(bob), expected = 1, actual = 2).getMessage) - assert(bob2blockchain.expectMsgType[PublishRawTx].tx === tx) + assert(bob2blockchain.expectMsgType[PublishRawTx].tx.txid === tx.txid) bob2blockchain.expectMsgType[PublishTx] bob2blockchain.expectMsgType[WatchTxConfirmed] } @@ -946,7 +946,7 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with import f._ addHtlc(50000000 msat, alice, bob, alice2bob, bob2alice) - val tx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val tx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx alice ! CMD_SIGN() val commitSig = alice2bob.expectMsgType[CommitSig] @@ -956,7 +956,7 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with bob ! badCommitSig val error = bob2alice.expectMsgType[Error] assert(new String(error.data.toArray).startsWith("invalid htlc signature")) - assert(bob2blockchain.expectMsgType[PublishRawTx].tx === tx) + assert(bob2blockchain.expectMsgType[PublishRawTx].tx.txid === tx.txid) bob2blockchain.expectMsgType[PublishTx] bob2blockchain.expectMsgType[WatchTxConfirmed] } @@ -1054,7 +1054,7 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with test("recv RevokeAndAck (invalid preimage)") { f => import f._ - val tx = alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val tx = alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx addHtlc(50000000 msat, alice, bob, alice2bob, bob2alice) alice ! CMD_SIGN() @@ -1068,21 +1068,21 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with awaitCond(alice.stateName == CLOSING) // channel should be advertised as down assert(channelUpdateListener.expectMsgType[LocalChannelDown].channelId === alice.stateData.asInstanceOf[DATA_CLOSING].channelId) - assert(alice2blockchain.expectMsgType[PublishRawTx].tx === tx) + assert(alice2blockchain.expectMsgType[PublishRawTx].tx.txid === tx.txid) alice2blockchain.expectMsgType[PublishTx] alice2blockchain.expectMsgType[WatchTxConfirmed] } test("recv RevokeAndAck (unexpectedly)") { f => import f._ - val tx = alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val tx = alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx awaitCond(alice.stateData.asInstanceOf[DATA_NORMAL].commitments.remoteNextCommitInfo.isRight) alice ! RevokeAndAck(ByteVector32.Zeroes, PrivateKey(randomBytes32()), PrivateKey(randomBytes32()).publicKey) alice2bob.expectMsgType[Error] awaitCond(alice.stateName == CLOSING) // channel should be advertised as down assert(channelUpdateListener.expectMsgType[LocalChannelDown].channelId === alice.stateData.asInstanceOf[DATA_CLOSING].channelId) - assert(alice2blockchain.expectMsgType[PublishRawTx].tx === tx) + assert(alice2blockchain.expectMsgType[PublishRawTx].tx.txid === tx.txid) alice2blockchain.expectMsgType[PublishTx] alice2blockchain.expectMsgType[WatchTxConfirmed] } @@ -1147,7 +1147,7 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with def aliceToRemoteScript(): ByteVector = { val toRemoteAmount = alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.spec.toRemote - val Some(toRemoteOut) = alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx.txOut.find(_.amount == toRemoteAmount.truncateToSatoshi) + val Some(toRemoteOut) = alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx.txOut.find(_.amount == toRemoteAmount.truncateToSatoshi) toRemoteOut.publicKeyScript } @@ -1316,26 +1316,26 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with alice2bob.expectMsgType[CommitSig] // actual test begins - val tx = alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val tx = alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx alice ! UpdateFulfillHtlc(ByteVector32.Zeroes, htlc.id, r) alice2bob.expectMsgType[Error] awaitCond(alice.stateName == CLOSING) // channel should be advertised as down assert(channelUpdateListener.expectMsgType[LocalChannelDown].channelId === alice.stateData.asInstanceOf[DATA_CLOSING].channelId) - assert(alice2blockchain.expectMsgType[PublishRawTx].tx === tx) + assert(alice2blockchain.expectMsgType[PublishRawTx].tx.txid === tx.txid) alice2blockchain.expectMsgType[PublishTx] alice2blockchain.expectMsgType[WatchTxConfirmed] } test("recv UpdateFulfillHtlc (unknown htlc id)") { f => import f._ - val tx = alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val tx = alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx alice ! UpdateFulfillHtlc(ByteVector32.Zeroes, 42, ByteVector32.Zeroes) alice2bob.expectMsgType[Error] awaitCond(alice.stateName == CLOSING) // channel should be advertised as down assert(channelUpdateListener.expectMsgType[LocalChannelDown].channelId === alice.stateData.asInstanceOf[DATA_CLOSING].channelId) - assert(alice2blockchain.expectMsgType[PublishRawTx].tx === tx) + assert(alice2blockchain.expectMsgType[PublishRawTx].tx.txid === tx.txid) alice2blockchain.expectMsgType[PublishTx] alice2blockchain.expectMsgType[WatchTxConfirmed] } @@ -1345,7 +1345,7 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with val (_, htlc) = addHtlc(50000000 msat, alice, bob, alice2bob, bob2alice) crossSign(alice, bob, alice2bob, bob2alice) relayerB.expectMsgType[RelayForward] - val tx = alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val tx = alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx // actual test begins alice ! UpdateFulfillHtlc(ByteVector32.Zeroes, htlc.id, ByteVector32.Zeroes) @@ -1353,7 +1353,7 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with awaitCond(alice.stateName == CLOSING) // channel should be advertised as down assert(channelUpdateListener.expectMsgType[LocalChannelDown].channelId === alice.stateData.asInstanceOf[DATA_CLOSING].channelId) - assert(alice2blockchain.expectMsgType[PublishRawTx].tx === tx) + assert(alice2blockchain.expectMsgType[PublishRawTx].tx.txid === tx.txid) alice2blockchain.expectMsgType[PublishTx] // main delayed alice2blockchain.expectMsgType[PublishTx] // htlc timeout alice2blockchain.expectMsgType[WatchTxConfirmed] @@ -1536,13 +1536,13 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with crossSign(alice, bob, alice2bob, bob2alice) // actual test begins - val tx = alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val tx = alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx val fail = UpdateFailMalformedHtlc(ByteVector32.Zeroes, htlc.id, Sphinx.PaymentPacket.hash(htlc.onionRoutingPacket), 42) alice ! fail val error = alice2bob.expectMsgType[Error] assert(new String(error.data.toArray) === InvalidFailureCode(ByteVector32.Zeroes).getMessage) awaitCond(alice.stateName == CLOSING) - assert(alice2blockchain.expectMsgType[PublishRawTx].tx === tx) // commit tx + assert(alice2blockchain.expectMsgType[PublishRawTx].tx.txid === tx.txid) // commit tx alice2blockchain.expectMsgType[PublishTx] // main delayed alice2blockchain.expectMsgType[PublishTx] // htlc timeout alice2blockchain.expectMsgType[WatchTxConfirmed] @@ -1555,26 +1555,26 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with alice2bob.expectMsgType[CommitSig] // actual test begins - val tx = alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val tx = alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx alice ! UpdateFailHtlc(ByteVector32.Zeroes, htlc.id, ByteVector.fill(152)(0)) alice2bob.expectMsgType[Error] awaitCond(alice.stateName == CLOSING) // channel should be advertised as down assert(channelUpdateListener.expectMsgType[LocalChannelDown].channelId === alice.stateData.asInstanceOf[DATA_CLOSING].channelId) - assert(alice2blockchain.expectMsgType[PublishRawTx].tx === tx) + assert(alice2blockchain.expectMsgType[PublishRawTx].tx.txid === tx.txid) alice2blockchain.expectMsgType[PublishTx] alice2blockchain.expectMsgType[WatchTxConfirmed] } test("recv UpdateFailHtlc (unknown htlc id)") { f => import f._ - val tx = alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val tx = alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx alice ! UpdateFailHtlc(ByteVector32.Zeroes, 42, ByteVector.fill(152)(0)) alice2bob.expectMsgType[Error] awaitCond(alice.stateName == CLOSING) // channel should be advertised as down assert(channelUpdateListener.expectMsgType[LocalChannelDown].channelId === alice.stateData.asInstanceOf[DATA_CLOSING].channelId) - assert(alice2blockchain.expectMsgType[PublishRawTx].tx === tx) + assert(alice2blockchain.expectMsgType[PublishRawTx].tx.txid === tx.txid) alice2blockchain.expectMsgType[PublishTx] alice2blockchain.expectMsgType[WatchTxConfirmed] } @@ -1660,20 +1660,20 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with test("recv UpdateFee (when sender is not funder)") { f => import f._ - val tx = alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val tx = alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx alice ! UpdateFee(ByteVector32.Zeroes, FeeratePerKw(12000 sat)) alice2bob.expectMsgType[Error] awaitCond(alice.stateName == CLOSING) // channel should be advertised as down assert(channelUpdateListener.expectMsgType[LocalChannelDown].channelId === alice.stateData.asInstanceOf[DATA_CLOSING].channelId) - assert(alice2blockchain.expectMsgType[PublishRawTx].tx === tx) + assert(alice2blockchain.expectMsgType[PublishRawTx].tx.txid === tx.txid) alice2blockchain.expectMsgType[PublishTx] alice2blockchain.expectMsgType[WatchTxConfirmed] } test("recv UpdateFee (sender can't afford it)") { f => import f._ - val tx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val tx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx val fee = UpdateFee(ByteVector32.Zeroes, FeeratePerKw(100000000 sat)) // we first update the feerates so that we don't trigger a 'fee too different' error bob.feeEstimator.setFeerate(FeeratesPerKw.single(fee.feeratePerKw)) @@ -1683,14 +1683,14 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with awaitCond(bob.stateName == CLOSING) // channel should be advertised as down assert(channelUpdateListener.expectMsgType[LocalChannelDown].channelId === bob.stateData.asInstanceOf[DATA_CLOSING].channelId) - assert(bob2blockchain.expectMsgType[PublishRawTx].tx === tx) // commit tx + assert(bob2blockchain.expectMsgType[PublishRawTx].tx.txid === tx.txid) // commit tx //bob2blockchain.expectMsgType[PublishTx] // main delayed (removed because of the high fees) bob2blockchain.expectMsgType[WatchTxConfirmed] } test("recv UpdateFee (sender can't afford it, anchor outputs)", Tag(StateTestsTags.AnchorOutputs)) { f => import f._ - val tx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val tx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx // This feerate is just above the threshold: (800000 (alice balance) - 20000 (reserve) - 660 (anchors)) / 1124 (commit tx weight) = 693363 bob ! UpdateFee(ByteVector32.Zeroes, FeeratePerKw(693364 sat)) val error = bob2alice.expectMsgType[Error] @@ -1698,14 +1698,14 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with awaitCond(bob.stateName == CLOSING) // channel should be advertised as down assert(channelUpdateListener.expectMsgType[LocalChannelDown].channelId === bob.stateData.asInstanceOf[DATA_CLOSING].channelId) - assert(bob2blockchain.expectMsgType[PublishRawTx].tx === tx) // commit tx + assert(bob2blockchain.expectMsgType[PublishRawTx].tx.txid === tx.txid) // commit tx } test("recv UpdateFee (local/remote feerates are too different)") { f => import f._ val initialState = bob.stateData.asInstanceOf[DATA_NORMAL] - val commitTx = initialState.commitments.localCommit.publishableTxs.commitTx.tx + val commitTx = initialState.commitments.localCommit.commitTxAndRemoteSig.commitTx.tx assert(initialState.commitments.localCommit.spec.feeratePerKw === TestConstants.feeratePerKw) alice2bob.send(bob, UpdateFee(ByteVector32.Zeroes, TestConstants.feeratePerKw * 3)) bob2alice.expectNoMsg(250 millis) // we don't close because the commitment doesn't contain any HTLC @@ -1717,7 +1717,7 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with awaitCond(bob.stateName == CLOSING) // channel should be advertised as down assert(channelUpdateListener.expectMsgType[LocalChannelDown].channelId === bob.stateData.asInstanceOf[DATA_CLOSING].channelId) - assert(bob2blockchain.expectMsgType[PublishRawTx].tx === commitTx) + assert(bob2blockchain.expectMsgType[PublishRawTx].tx.txid === commitTx.txid) bob2blockchain.expectMsgType[PublishTx] bob2blockchain.expectMsgType[WatchTxConfirmed] } @@ -1726,7 +1726,7 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with import f._ val initialState = bob.stateData.asInstanceOf[DATA_NORMAL] - val commitTx = initialState.commitments.localCommit.publishableTxs.commitTx.tx + val commitTx = initialState.commitments.localCommit.commitTxAndRemoteSig.commitTx.tx assert(initialState.commitments.localCommit.spec.feeratePerKw === TestConstants.anchorOutputsFeeratePerKw) alice2bob.send(bob, UpdateFee(initialState.channelId, TestConstants.anchorOutputsFeeratePerKw * 3)) bob2alice.expectNoMsg(250 millis) // we don't close because the commitment doesn't contain any HTLC @@ -1738,14 +1738,14 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with awaitCond(bob.stateName == CLOSING) // channel should be advertised as down assert(channelUpdateListener.expectMsgType[LocalChannelDown].channelId === bob.stateData.asInstanceOf[DATA_CLOSING].channelId) - assert(bob2blockchain.expectMsgType[PublishRawTx].tx === commitTx) + assert(bob2blockchain.expectMsgType[PublishRawTx].tx.txid === commitTx.txid) } test("recv UpdateFee (remote feerate is too small, anchor outputs)", Tag(StateTestsTags.AnchorOutputs)) { f => import f._ val initialState = bob.stateData.asInstanceOf[DATA_NORMAL] - val commitTx = initialState.commitments.localCommit.publishableTxs.commitTx.tx + val commitTx = initialState.commitments.localCommit.commitTxAndRemoteSig.commitTx.tx assert(initialState.commitments.localCommit.spec.feeratePerKw === TestConstants.anchorOutputsFeeratePerKw) alice2bob.send(bob, UpdateFee(initialState.channelId, FeeratePerKw(FeeratePerByte(2 sat)))) bob2alice.expectNoMsg(250 millis) // we don't close because the commitment doesn't contain any HTLC @@ -1757,13 +1757,13 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with awaitCond(bob.stateName == CLOSING) // channel should be advertised as down assert(channelUpdateListener.expectMsgType[LocalChannelDown].channelId === bob.stateData.asInstanceOf[DATA_CLOSING].channelId) - assert(bob2blockchain.expectMsgType[PublishRawTx].tx === commitTx) + assert(bob2blockchain.expectMsgType[PublishRawTx].tx.txid === commitTx.txid) } test("recv UpdateFee (remote feerate is too small)") { f => import f._ val bobCommitments = bob.stateData.asInstanceOf[DATA_NORMAL].commitments - val tx = bobCommitments.localCommit.publishableTxs.commitTx.tx + val tx = bobCommitments.localCommit.commitTxAndRemoteSig.commitTx.tx val expectedFeeratePerKw = bob.feeEstimator.getFeeratePerKw(bob.feeTargets.commitmentBlockTarget) assert(bobCommitments.localCommit.spec.feeratePerKw == expectedFeeratePerKw) bob ! UpdateFee(ByteVector32.Zeroes, FeeratePerKw(252 sat)) @@ -1772,7 +1772,7 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with awaitCond(bob.stateName == CLOSING) // channel should be advertised as down assert(channelUpdateListener.expectMsgType[LocalChannelDown].channelId === bob.stateData.asInstanceOf[DATA_CLOSING].channelId) - assert(bob2blockchain.expectMsgType[PublishRawTx].tx === tx) + assert(bob2blockchain.expectMsgType[PublishRawTx].tx.txid === tx.txid) bob2blockchain.expectMsgType[PublishTx] bob2blockchain.expectMsgType[WatchTxConfirmed] } @@ -2124,9 +2124,9 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with // actual test begins val initialState = alice.stateData.asInstanceOf[DATA_NORMAL] - val aliceCommitTx = initialState.commitments.localCommit.publishableTxs.commitTx.tx + val aliceCommitTx = initialState.commitments.localCommit.commitTxAndRemoteSig.commitTx.tx alice ! CurrentBlockCount(400145) - assert(alice2blockchain.expectMsgType[PublishRawTx].tx === aliceCommitTx) + assert(alice2blockchain.expectMsgType[PublishRawTx].tx.txid === aliceCommitTx.txid) alice2blockchain.expectMsgType[PublishTx] // main delayed alice2blockchain.expectMsgType[PublishTx] // htlc timeout @@ -2147,8 +2147,8 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with // * When the HTLC timeout on Alice side is near, Bob needs to close the channel to avoid an on-chain race // condition between his HTLC-success and Alice's HTLC-timeout val initialState = bob.stateData.asInstanceOf[DATA_NORMAL] - val initialCommitTx = initialState.commitments.localCommit.publishableTxs.commitTx.tx - val HtlcSuccessTx(_, htlcSuccessTx, _, _) = initialState.commitments.localCommit.publishableTxs.htlcTxsAndSigs.head.txinfo + val initialCommitTx = initialState.commitments.localCommit.commitTxAndRemoteSig.commitTx.tx + val HtlcSuccessTx(_, htlcSuccessTx, _, _) = initialState.commitments.localCommit.htlcTxsAndRemoteSigs.head.htlcTx bob ! CMD_FULFILL_HTLC(htlc.id, r, commit = true) bob2alice.expectMsgType[UpdateFulfillHtlc] @@ -2159,7 +2159,7 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with assert(isFatal) assert(err.isInstanceOf[HtlcsWillTimeoutUpstream]) - assert(bob2blockchain.expectMsgType[PublishRawTx].tx === initialCommitTx) + assert(bob2blockchain.expectMsgType[PublishRawTx].tx.txid === initialCommitTx.txid) bob2blockchain.expectMsgType[PublishTx] // main delayed assert(bob2blockchain.expectMsgType[PublishRawTx].tx.txOut === htlcSuccessTx.txOut) assert(bob2blockchain.expectMsgType[WatchTxConfirmed].txId === initialCommitTx.txid) @@ -2180,8 +2180,8 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with // * When the HTLC timeout on Alice side is near, Bob needs to close the channel to avoid an on-chain race // condition between his HTLC-success and Alice's HTLC-timeout val initialState = bob.stateData.asInstanceOf[DATA_NORMAL] - val initialCommitTx = initialState.commitments.localCommit.publishableTxs.commitTx.tx - val HtlcSuccessTx(_, htlcSuccessTx, _, _) = initialState.commitments.localCommit.publishableTxs.htlcTxsAndSigs.head.txinfo + val initialCommitTx = initialState.commitments.localCommit.commitTxAndRemoteSig.commitTx.tx + val HtlcSuccessTx(_, htlcSuccessTx, _, _) = initialState.commitments.localCommit.htlcTxsAndRemoteSigs.head.htlcTx bob ! CMD_FULFILL_HTLC(htlc.id, r, commit = false) bob2alice.expectMsgType[UpdateFulfillHtlc] @@ -2192,7 +2192,7 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with assert(isFatal) assert(err.isInstanceOf[HtlcsWillTimeoutUpstream]) - assert(bob2blockchain.expectMsgType[PublishRawTx].tx === initialCommitTx) + assert(bob2blockchain.expectMsgType[PublishRawTx].tx.txid === initialCommitTx.txid) bob2blockchain.expectMsgType[PublishTx] // main delayed assert(bob2blockchain.expectMsgType[PublishRawTx].tx.txOut === htlcSuccessTx.txOut) assert(bob2blockchain.expectMsgType[WatchTxConfirmed].txId === initialCommitTx.txid) @@ -2213,8 +2213,8 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with // * When the HTLC timeout on Alice side is near, Bob needs to close the channel to avoid an on-chain race // condition between his HTLC-success and Alice's HTLC-timeout val initialState = bob.stateData.asInstanceOf[DATA_NORMAL] - val initialCommitTx = initialState.commitments.localCommit.publishableTxs.commitTx.tx - val HtlcSuccessTx(_, htlcSuccessTx, _, _) = initialState.commitments.localCommit.publishableTxs.htlcTxsAndSigs.head.txinfo + val initialCommitTx = initialState.commitments.localCommit.commitTxAndRemoteSig.commitTx.tx + val HtlcSuccessTx(_, htlcSuccessTx, _, _) = initialState.commitments.localCommit.htlcTxsAndRemoteSigs.head.htlcTx bob ! CMD_FULFILL_HTLC(htlc.id, r, commit = true) bob2alice.expectMsgType[UpdateFulfillHtlc] @@ -2229,7 +2229,7 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with assert(isFatal) assert(err.isInstanceOf[HtlcsWillTimeoutUpstream]) - assert(bob2blockchain.expectMsgType[PublishRawTx].tx === initialCommitTx) + assert(bob2blockchain.expectMsgType[PublishRawTx].tx.txid === initialCommitTx.txid) bob2blockchain.expectMsgType[PublishTx] // main delayed assert(bob2blockchain.expectMsgType[PublishRawTx].tx.txOut === htlcSuccessTx.txOut) assert(bob2blockchain.expectMsgType[WatchTxConfirmed].txId === initialCommitTx.txid) @@ -2353,7 +2353,7 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with // bob -> alice : 55 000 000 (alice does not have the preimage) => nothing to do, bob will get his money back after the timeout // bob publishes his current commit tx - val bobCommitTx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val bobCommitTx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx assert(bobCommitTx.txOut.size == 6) // two main outputs and 4 pending htlcs alice ! WatchFundingSpentTriggered(bobCommitTx) @@ -2423,7 +2423,7 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with // bob -> alice : 55 000 000 (alice does not have the preimage) => nothing to do, bob will get his money back after the timeout // bob publishes his current commit tx - val bobCommitTx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val bobCommitTx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx assert(bobCommitTx.txOut.size == 5) // two main outputs and 3 pending htlcs alice ! WatchFundingSpentTriggered(bobCommitTx) @@ -2463,7 +2463,7 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with addHtlc(10000000 msat, alice, bob, alice2bob, bob2alice) crossSign(alice, bob, alice2bob, bob2alice) - bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx } val txs = for (_ <- 0 until 10) yield send() @@ -2530,7 +2530,7 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with crossSign(alice, bob, alice2bob, bob2alice) // bob will publish this tx after it is revoked - val revokedTx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val revokedTx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx alice ! add sender.expectMsgType[RES_SUCCESS[CMD_ADD_HTLC]] @@ -2586,14 +2586,14 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with // bob -> alice : 55 000 000 (alice does not have the preimage) => nothing to do, bob will get his money back after the timeout // an error occurs and alice publishes her commit tx - val aliceCommitTx = alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val aliceCommitTx = alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx alice ! Error(ByteVector32.Zeroes, "oops") - assert(alice2blockchain.expectMsgType[PublishRawTx].tx === aliceCommitTx) + assert(alice2blockchain.expectMsgType[PublishRawTx].tx.txid === aliceCommitTx.txid) assert(aliceCommitTx.txOut.size == 6) // two main outputs and 4 pending htlcs awaitCond(alice.stateName == CLOSING) assert(alice.stateData.asInstanceOf[DATA_CLOSING].localCommitPublished.isDefined) val localCommitPublished = alice.stateData.asInstanceOf[DATA_CLOSING].localCommitPublished.get - assert(localCommitPublished.commitTx == aliceCommitTx) + assert(localCommitPublished.commitTx.txid == aliceCommitTx.txid) assert(localCommitPublished.htlcTxs.size === 4) assert(getHtlcSuccessTxs(localCommitPublished).length === 1) assert(getHtlcTimeoutTxs(localCommitPublished).length === 2) @@ -2639,16 +2639,16 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with // have lost its data and need assistance // an error occurs and alice publishes her commit tx - val bobCommitTx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val bobCommitTx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx bob ! Error(ByteVector32.Zeroes, "oops") - assert(bob2blockchain.expectMsgType[PublishRawTx].tx === bobCommitTx) + assert(bob2blockchain.expectMsgType[PublishRawTx].tx.txid === bobCommitTx.txid) assert(bobCommitTx.txOut.size == 1) // only one main output alice2blockchain.expectNoMsg(1 second) awaitCond(bob.stateName == CLOSING) assert(bob.stateData.asInstanceOf[DATA_CLOSING].localCommitPublished.isDefined) val localCommitPublished = bob.stateData.asInstanceOf[DATA_CLOSING].localCommitPublished.get - assert(localCommitPublished.commitTx == bobCommitTx) + assert(localCommitPublished.commitTx.txid == bobCommitTx.txid) } test("recv WatchFundingDeeplyBuriedTriggered", Tag(StateTestsTags.ChannelsPublic)) { f => diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/e/OfflineStateSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/e/OfflineStateSpec.scala index aeaccd4d00..91bf298f48 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/e/OfflineStateSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/e/OfflineStateSpec.scala @@ -271,7 +271,7 @@ class OfflineStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with awaitCond(alice.stateName == WAIT_FOR_REMOTE_PUBLISH_FUTURE_COMMITMENT) // bob is nice and publishes its commitment - val bobCommitTx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val bobCommitTx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx alice ! WatchFundingSpentTriggered(bobCommitTx) // alice is able to claim its main output @@ -316,7 +316,7 @@ class OfflineStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with awaitCond(alice.stateName == WAIT_FOR_REMOTE_PUBLISH_FUTURE_COMMITMENT) // bob is nice and publishes its commitment - val bobCommitTx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val bobCommitTx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx alice ! WatchFundingSpentTriggered(bobCommitTx) // alice is able to claim its main output @@ -326,7 +326,7 @@ class OfflineStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with test("counterparty lies about having a more recent commitment") { f => import f._ - val aliceCommitTx = alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val aliceCommitTx = alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx // we simulate a disconnection followed by a reconnection disconnect(alice, bob) @@ -340,7 +340,7 @@ class OfflineStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with // alice then finds out bob is lying bob2alice.send(alice, invalidReestablish) val error = alice2bob.expectMsgType[Error] - assert(alice2blockchain.expectMsgType[PublishRawTx].tx === aliceCommitTx) + assert(alice2blockchain.expectMsgType[PublishRawTx].tx.txid === aliceCommitTx.txid) val claimMainOutput = alice2blockchain.expectMsgType[PublishRawTx].tx Transaction.correctlySpends(claimMainOutput, aliceCommitTx :: Nil, ScriptFlags.STANDARD_SCRIPT_VERIFY_FLAGS) assert(error === Error(channelId(alice), InvalidRevokedCommitProof(channelId(alice), 0, 42, invalidReestablish.yourLastPerCommitmentSecret).getMessage)) @@ -470,8 +470,8 @@ class OfflineStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with system.eventStream.subscribe(listener.ref, classOf[ChannelErrorOccurred]) val initialState = bob.stateData.asInstanceOf[DATA_NORMAL] - val initialCommitTx = initialState.commitments.localCommit.publishableTxs.commitTx.tx - val HtlcSuccessTx(_, htlcSuccessTx, _, _) = initialState.commitments.localCommit.publishableTxs.htlcTxsAndSigs.head.txinfo + val initialCommitTx = initialState.commitments.localCommit.commitTxAndRemoteSig.commitTx.tx + val HtlcSuccessTx(_, htlcSuccessTx, _, _) = initialState.commitments.localCommit.htlcTxsAndRemoteSigs.head.htlcTx disconnect(alice, bob) @@ -484,13 +484,13 @@ class OfflineStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with assert(isFatal) assert(err.isInstanceOf[HtlcsWillTimeoutUpstream]) - assert(bob2blockchain.expectMsgType[PublishRawTx].tx === initialCommitTx) + assert(bob2blockchain.expectMsgType[PublishRawTx].tx.txid === initialCommitTx.txid) bob2blockchain.expectMsgType[PublishTx] // main delayed assert(bob2blockchain.expectMsgType[WatchTxConfirmed].txId === initialCommitTx.txid) bob2blockchain.expectMsgType[WatchTxConfirmed] // main delayed bob2blockchain.expectMsgType[WatchOutputSpent] // htlc - assert(bob2blockchain.expectMsgType[PublishRawTx].tx === initialCommitTx) + assert(bob2blockchain.expectMsgType[PublishRawTx].tx.txid === initialCommitTx.txid) bob2blockchain.expectMsgType[PublishTx] // main delayed assert(bob2blockchain.expectMsgType[PublishRawTx].tx.txOut === htlcSuccessTx.txOut) assert(bob2blockchain.expectMsgType[WatchTxConfirmed].txId === initialCommitTx.txid) @@ -536,7 +536,7 @@ class OfflineStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with disconnect(alice, bob) val aliceStateData = alice.stateData.asInstanceOf[DATA_NORMAL] - val aliceCommitTx = aliceStateData.commitments.localCommit.publishableTxs.commitTx.tx + val aliceCommitTx = aliceStateData.commitments.localCommit.commitTxAndRemoteSig.commitTx.tx val currentFeeratePerKw = aliceStateData.commitments.localCommit.spec.feeratePerKw // we receive a feerate update that makes our current feerate too low compared to the network's (we multiply by 1.1 @@ -547,7 +547,7 @@ class OfflineStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with // alice is funder alice ! CurrentFeerates(networkFeerate) if (shouldClose) { - assert(alice2blockchain.expectMsgType[PublishRawTx].tx === aliceCommitTx) + assert(alice2blockchain.expectMsgType[PublishRawTx].tx.txid === aliceCommitTx.txid) } else { alice2blockchain.expectNoMsg() } @@ -645,7 +645,7 @@ class OfflineStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with disconnect(alice, bob) val bobStateData = bob.stateData.asInstanceOf[DATA_NORMAL] - val bobCommitTx = bobStateData.commitments.localCommit.publishableTxs.commitTx.tx + val bobCommitTx = bobStateData.commitments.localCommit.commitTxAndRemoteSig.commitTx.tx val currentFeeratePerKw = bobStateData.commitments.localCommit.spec.feeratePerKw // we receive a feerate update that makes our current feerate too low compared to the network's (we multiply by 1.1 @@ -656,7 +656,7 @@ class OfflineStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with // bob is fundee bob ! CurrentFeerates(networkFeerate) if (shouldClose) { - assert(bob2blockchain.expectMsgType[PublishRawTx].tx === bobCommitTx) + assert(bob2blockchain.expectMsgType[PublishRawTx].tx.txid === bobCommitTx.txid) } else { bob2blockchain.expectNoMsg() } diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/f/ShutdownStateSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/f/ShutdownStateSpec.scala index 93079a195d..6117fc7436 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/f/ShutdownStateSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/f/ShutdownStateSpec.scala @@ -179,12 +179,12 @@ class ShutdownStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike wit test("recv UpdateFulfillHtlc (unknown htlc id)") { f => import f._ - val tx = alice.stateData.asInstanceOf[DATA_SHUTDOWN].commitments.localCommit.publishableTxs.commitTx.tx + val tx = alice.stateData.asInstanceOf[DATA_SHUTDOWN].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx val fulfill = UpdateFulfillHtlc(ByteVector32.Zeroes, 42, ByteVector32.Zeroes) alice ! fulfill alice2bob.expectMsgType[Error] awaitCond(alice.stateName == CLOSING) - assert(alice2blockchain.expectMsgType[PublishRawTx].tx === tx) // commit tx + assert(alice2blockchain.expectMsgType[PublishRawTx].tx.txid === tx.txid) // commit tx alice2blockchain.expectMsgType[PublishTx] // main delayed alice2blockchain.expectMsgType[PublishTx] // htlc timeout 1 alice2blockchain.expectMsgType[PublishTx] // htlc timeout 2 @@ -193,11 +193,11 @@ class ShutdownStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike wit test("recv UpdateFulfillHtlc (invalid preimage)") { f => import f._ - val tx = alice.stateData.asInstanceOf[DATA_SHUTDOWN].commitments.localCommit.publishableTxs.commitTx.tx + val tx = alice.stateData.asInstanceOf[DATA_SHUTDOWN].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx alice ! UpdateFulfillHtlc(ByteVector32.Zeroes, 42, ByteVector32.Zeroes) alice2bob.expectMsgType[Error] awaitCond(alice.stateName == CLOSING) - assert(alice2blockchain.expectMsgType[PublishRawTx].tx === tx) // commit tx + assert(alice2blockchain.expectMsgType[PublishRawTx].tx.txid === tx.txid) // commit tx alice2blockchain.expectMsgType[PublishTx] // main delayed alice2blockchain.expectMsgType[PublishTx] // htlc timeout 1 alice2blockchain.expectMsgType[PublishTx] // htlc timeout 2 @@ -284,11 +284,11 @@ class ShutdownStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike wit test("recv UpdateFailHtlc (unknown htlc id)") { f => import f._ - val tx = alice.stateData.asInstanceOf[DATA_SHUTDOWN].commitments.localCommit.publishableTxs.commitTx.tx + val tx = alice.stateData.asInstanceOf[DATA_SHUTDOWN].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx alice ! UpdateFailHtlc(ByteVector32.Zeroes, 42, ByteVector.fill(152)(0)) alice2bob.expectMsgType[Error] awaitCond(alice.stateName == CLOSING) - assert(alice2blockchain.expectMsgType[PublishRawTx].tx === tx) // commit tx + assert(alice2blockchain.expectMsgType[PublishRawTx].tx.txid === tx.txid) // commit tx alice2blockchain.expectMsgType[PublishTx] // main delayed alice2blockchain.expectMsgType[PublishTx] // htlc timeout 1 alice2blockchain.expectMsgType[PublishTx] // htlc timeout 2 @@ -305,13 +305,13 @@ class ShutdownStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike wit test("recv UpdateFailMalformedHtlc (invalid failure_code)") { f => import f._ - val tx = alice.stateData.asInstanceOf[DATA_SHUTDOWN].commitments.localCommit.publishableTxs.commitTx.tx + val tx = alice.stateData.asInstanceOf[DATA_SHUTDOWN].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx val fail = UpdateFailMalformedHtlc(ByteVector32.Zeroes, 1, Crypto.sha256(ByteVector.empty), 42) alice ! fail val error = alice2bob.expectMsgType[Error] assert(new String(error.data.toArray) === InvalidFailureCode(ByteVector32.Zeroes).getMessage) awaitCond(alice.stateName == CLOSING) - assert(alice2blockchain.expectMsgType[PublishRawTx].tx === tx) // commit tx + assert(alice2blockchain.expectMsgType[PublishRawTx].tx.txid === tx.txid) // commit tx alice2blockchain.expectMsgType[PublishTx] // main delayed alice2blockchain.expectMsgType[PublishTx] // htlc timeout 1 alice2blockchain.expectMsgType[PublishTx] // htlc timeout 2 @@ -374,23 +374,23 @@ class ShutdownStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike wit test("recv CommitSig (no changes)") { f => import f._ - val tx = bob.stateData.asInstanceOf[DATA_SHUTDOWN].commitments.localCommit.publishableTxs.commitTx.tx + val tx = bob.stateData.asInstanceOf[DATA_SHUTDOWN].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx // signature is invalid but it doesn't matter bob ! CommitSig(ByteVector32.Zeroes, ByteVector64.Zeroes, Nil) bob2alice.expectMsgType[Error] awaitCond(bob.stateName == CLOSING) - assert(bob2blockchain.expectMsgType[PublishRawTx].tx === tx) // commit tx + assert(bob2blockchain.expectMsgType[PublishRawTx].tx.txid === tx.txid) // commit tx bob2blockchain.expectMsgType[PublishTx] // main delayed bob2blockchain.expectMsgType[WatchTxConfirmed] } test("recv CommitSig (invalid signature)") { f => import f._ - val tx = bob.stateData.asInstanceOf[DATA_SHUTDOWN].commitments.localCommit.publishableTxs.commitTx.tx + val tx = bob.stateData.asInstanceOf[DATA_SHUTDOWN].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx bob ! CommitSig(ByteVector32.Zeroes, ByteVector64.Zeroes, Nil) bob2alice.expectMsgType[Error] awaitCond(bob.stateName == CLOSING) - assert(bob2blockchain.expectMsgType[PublishRawTx].tx === tx) // commit tx + assert(bob2blockchain.expectMsgType[PublishRawTx].tx.txid === tx.txid) // commit tx bob2blockchain.expectMsgType[PublishTx] // main delayed bob2blockchain.expectMsgType[WatchTxConfirmed] } @@ -434,7 +434,7 @@ class ShutdownStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike wit test("recv RevokeAndAck (invalid preimage)") { f => import f._ - val tx = bob.stateData.asInstanceOf[DATA_SHUTDOWN].commitments.localCommit.publishableTxs.commitTx.tx + val tx = bob.stateData.asInstanceOf[DATA_SHUTDOWN].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx bob ! CMD_FULFILL_HTLC(0, r1) bob2alice.expectMsgType[UpdateFulfillHtlc] bob2alice.forward(alice) @@ -446,7 +446,7 @@ class ShutdownStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike wit bob ! RevokeAndAck(ByteVector32.Zeroes, PrivateKey(randomBytes32()), PrivateKey(randomBytes32()).publicKey) bob2alice.expectMsgType[Error] awaitCond(bob.stateName == CLOSING) - assert(bob2blockchain.expectMsgType[PublishRawTx].tx === tx) // commit tx + assert(bob2blockchain.expectMsgType[PublishRawTx].tx.txid === tx.txid) // commit tx bob2blockchain.expectMsgType[PublishTx] // main delayed bob2blockchain.expectMsgType[PublishTx] // htlc success bob2blockchain.expectMsgType[WatchTxConfirmed] @@ -454,12 +454,12 @@ class ShutdownStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike wit test("recv RevokeAndAck (unexpectedly)") { f => import f._ - val tx = alice.stateData.asInstanceOf[DATA_SHUTDOWN].commitments.localCommit.publishableTxs.commitTx.tx + val tx = alice.stateData.asInstanceOf[DATA_SHUTDOWN].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx awaitCond(alice.stateData.asInstanceOf[DATA_SHUTDOWN].commitments.remoteNextCommitInfo.isRight) alice ! RevokeAndAck(ByteVector32.Zeroes, PrivateKey(randomBytes32()), PrivateKey(randomBytes32()).publicKey) alice2bob.expectMsgType[Error] awaitCond(alice.stateName == CLOSING) - assert(alice2blockchain.expectMsgType[PublishRawTx].tx === tx) // commit tx + assert(alice2blockchain.expectMsgType[PublishRawTx].tx.txid === tx.txid) // commit tx alice2blockchain.expectMsgType[PublishTx] // main delayed alice2blockchain.expectMsgType[PublishTx] // htlc timeout 1 alice2blockchain.expectMsgType[PublishTx] // htlc timeout 2 @@ -543,11 +543,11 @@ class ShutdownStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike wit test("recv UpdateFee (when sender is not funder)") { f => import f._ - val tx = alice.stateData.asInstanceOf[DATA_SHUTDOWN].commitments.localCommit.publishableTxs.commitTx.tx + val tx = alice.stateData.asInstanceOf[DATA_SHUTDOWN].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx alice ! UpdateFee(ByteVector32.Zeroes, FeeratePerKw(12000 sat)) alice2bob.expectMsgType[Error] awaitCond(alice.stateName == CLOSING) - assert(alice2blockchain.expectMsgType[PublishRawTx].tx === tx) // commit tx + assert(alice2blockchain.expectMsgType[PublishRawTx].tx.txid === tx.txid) // commit tx alice2blockchain.expectMsgType[PublishTx] // main delayed alice2blockchain.expectMsgType[PublishTx] // htlc timeout 1 alice2blockchain.expectMsgType[PublishTx] // htlc timeout 2 @@ -556,7 +556,7 @@ class ShutdownStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike wit test("recv UpdateFee (sender can't afford it)") { f => import f._ - val tx = bob.stateData.asInstanceOf[DATA_SHUTDOWN].commitments.localCommit.publishableTxs.commitTx.tx + val tx = bob.stateData.asInstanceOf[DATA_SHUTDOWN].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx val fee = UpdateFee(ByteVector32.Zeroes, FeeratePerKw(100000000 sat)) // we first update the feerates so that we don't trigger a 'fee too different' error bob.feeEstimator.setFeerate(FeeratesPerKw.single(fee.feeratePerKw)) @@ -564,31 +564,31 @@ class ShutdownStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike wit val error = bob2alice.expectMsgType[Error] assert(new String(error.data.toArray) === CannotAffordFees(channelId(bob), missing = 72120000L sat, reserve = 20000L sat, fees = 72400000L sat).getMessage) awaitCond(bob.stateName == CLOSING) - assert(bob2blockchain.expectMsgType[PublishRawTx].tx === tx) // commit tx + assert(bob2blockchain.expectMsgType[PublishRawTx].tx.txid === tx.txid) // commit tx //bob2blockchain.expectMsgType[PublishTx] // main delayed (removed because of the high fees) bob2blockchain.expectMsgType[WatchTxConfirmed] } test("recv UpdateFee (local/remote feerates are too different)") { f => import f._ - val tx = bob.stateData.asInstanceOf[DATA_SHUTDOWN].commitments.localCommit.publishableTxs.commitTx.tx + val tx = bob.stateData.asInstanceOf[DATA_SHUTDOWN].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx bob ! UpdateFee(ByteVector32.Zeroes, FeeratePerKw(65000 sat)) val error = bob2alice.expectMsgType[Error] assert(new String(error.data.toArray) === "local/remote feerates are too different: remoteFeeratePerKw=65000 localFeeratePerKw=10000") awaitCond(bob.stateName == CLOSING) - assert(bob2blockchain.expectMsgType[PublishRawTx].tx === tx) // commit tx + assert(bob2blockchain.expectMsgType[PublishRawTx].tx.txid === tx.txid) // commit tx bob2blockchain.expectMsgType[PublishTx] // main delayed bob2blockchain.expectMsgType[WatchTxConfirmed] } test("recv UpdateFee (remote feerate is too small)") { f => import f._ - val tx = bob.stateData.asInstanceOf[DATA_SHUTDOWN].commitments.localCommit.publishableTxs.commitTx.tx + val tx = bob.stateData.asInstanceOf[DATA_SHUTDOWN].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx bob ! UpdateFee(ByteVector32.Zeroes, FeeratePerKw(252 sat)) val error = bob2alice.expectMsgType[Error] assert(new String(error.data.toArray) === "remote fee rate is too small: remoteFeeratePerKw=252") awaitCond(bob.stateName == CLOSING) - assert(bob2blockchain.expectMsgType[PublishRawTx].tx === tx) // commit tx + assert(bob2blockchain.expectMsgType[PublishRawTx].tx.txid === tx.txid) // commit tx bob2blockchain.expectMsgType[PublishTx] // main delayed bob2blockchain.expectMsgType[WatchTxConfirmed] } @@ -613,9 +613,9 @@ class ShutdownStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike wit test("recv CurrentBlockCount (an htlc timed out)") { f => import f._ val initialState = alice.stateData.asInstanceOf[DATA_SHUTDOWN] - val aliceCommitTx = initialState.commitments.localCommit.publishableTxs.commitTx.tx + val aliceCommitTx = initialState.commitments.localCommit.commitTxAndRemoteSig.commitTx.tx alice ! CurrentBlockCount(400145) - assert(alice2blockchain.expectMsgType[PublishRawTx].tx === aliceCommitTx) // commit tx + assert(alice2blockchain.expectMsgType[PublishRawTx].tx.txid === aliceCommitTx.txid) // commit tx alice2blockchain.expectMsgType[PublishTx] // main delayed alice2blockchain.expectMsgType[PublishTx] // htlc timeout 1 alice2blockchain.expectMsgType[PublishTx] // htlc timeout 2 @@ -674,7 +674,7 @@ class ShutdownStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike wit test("recv WatchFundingSpentTriggered (their commit)") { f => import f._ // bob publishes his current commit tx, which contains two pending htlcs alice->bob - val bobCommitTx = bob.stateData.asInstanceOf[DATA_SHUTDOWN].commitments.localCommit.publishableTxs.commitTx.tx + val bobCommitTx = bob.stateData.asInstanceOf[DATA_SHUTDOWN].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx assert(bobCommitTx.txOut.size == 4) // two main outputs and 2 pending htlcs alice ! WatchFundingSpentTriggered(bobCommitTx) @@ -721,7 +721,7 @@ class ShutdownStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike wit // as far as alice knows, bob currently has two valid unrevoked commitment transactions // bob publishes his current commit tx, which contains one pending htlc alice->bob - val bobCommitTx = bob.stateData.asInstanceOf[DATA_SHUTDOWN].commitments.localCommit.publishableTxs.commitTx.tx + val bobCommitTx = bob.stateData.asInstanceOf[DATA_SHUTDOWN].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx assert(bobCommitTx.txOut.size == 3) // two main outputs and 1 pending htlc alice ! WatchFundingSpentTriggered(bobCommitTx) @@ -752,7 +752,7 @@ class ShutdownStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike wit test("recv WatchFundingSpentTriggered (revoked tx)") { f => import f._ - val revokedTx = bob.stateData.asInstanceOf[DATA_SHUTDOWN].commitments.localCommit.publishableTxs.commitTx.tx + val revokedTx = bob.stateData.asInstanceOf[DATA_SHUTDOWN].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx // two main outputs + 2 htlc assert(revokedTx.txOut.size == 4) @@ -794,13 +794,13 @@ class ShutdownStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike wit test("recv WatchFundingSpentTriggered (revoked tx with updated commitment)") { f => import f._ - val initialCommitTx = bob.stateData.asInstanceOf[DATA_SHUTDOWN].commitments.localCommit.publishableTxs.commitTx.tx + val initialCommitTx = bob.stateData.asInstanceOf[DATA_SHUTDOWN].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx assert(initialCommitTx.txOut.size === 4) // two main outputs + 2 htlc // bob fulfills one of the pending htlc (commitment update while in shutdown state) fulfillHtlc(0, r1, bob, alice, bob2alice, alice2bob) crossSign(bob, alice, bob2alice, alice2bob) - val revokedTx = bob.stateData.asInstanceOf[DATA_SHUTDOWN].commitments.localCommit.publishableTxs.commitTx.tx + val revokedTx = bob.stateData.asInstanceOf[DATA_SHUTDOWN].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx assert(revokedTx.txOut.size === 3) // two main outputs + 1 htlc // bob fulfills the second pending htlc (and revokes the previous commitment) @@ -844,13 +844,13 @@ class ShutdownStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike wit test("recv CMD_FORCECLOSE") { f => import f._ - val aliceCommitTx = alice.stateData.asInstanceOf[DATA_SHUTDOWN].commitments.localCommit.publishableTxs.commitTx.tx + val aliceCommitTx = alice.stateData.asInstanceOf[DATA_SHUTDOWN].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx assert(aliceCommitTx.txOut.size == 4) // two main outputs and two htlcs val sender = TestProbe() alice ! CMD_FORCECLOSE(sender.ref) sender.expectMsgType[RES_SUCCESS[CMD_FORCECLOSE]] - assert(alice2blockchain.expectMsgType[PublishRawTx].tx === aliceCommitTx) + assert(alice2blockchain.expectMsgType[PublishRawTx].tx.txid === aliceCommitTx.txid) awaitCond(alice.stateName == CLOSING) assert(alice.stateData.asInstanceOf[DATA_CLOSING].localCommitPublished.isDefined) val lcp = alice.stateData.asInstanceOf[DATA_CLOSING].localCommitPublished.get @@ -882,9 +882,9 @@ class ShutdownStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike wit test("recv Error") { f => import f._ - val aliceCommitTx = alice.stateData.asInstanceOf[DATA_SHUTDOWN].commitments.localCommit.publishableTxs.commitTx.tx + val aliceCommitTx = alice.stateData.asInstanceOf[DATA_SHUTDOWN].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx alice ! Error(ByteVector32.Zeroes, "oops") - assert(alice2blockchain.expectMsgType[PublishRawTx].tx === aliceCommitTx) + assert(alice2blockchain.expectMsgType[PublishRawTx].tx.txid === aliceCommitTx.txid) assert(aliceCommitTx.txOut.size == 4) // two main outputs and two htlcs awaitCond(alice.stateName == CLOSING) assert(alice.stateData.asInstanceOf[DATA_CLOSING].localCommitPublished.isDefined) diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/g/NegotiatingStateSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/g/NegotiatingStateSpec.scala index 5b992d321a..6cbea38dcf 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/g/NegotiatingStateSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/g/NegotiatingStateSpec.scala @@ -159,11 +159,11 @@ class NegotiatingStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike import f._ val aliceCloseSig = alice2bob.expectMsgType[ClosingSigned] val sender = TestProbe() - val tx = bob.stateData.asInstanceOf[DATA_NEGOTIATING].commitments.localCommit.publishableTxs.commitTx.tx + val tx = bob.stateData.asInstanceOf[DATA_NEGOTIATING].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx sender.send(bob, aliceCloseSig.copy(feeSatoshis = 99000 sat)) // sig doesn't matter, it is checked later val error = bob2alice.expectMsgType[Error] assert(new String(error.data.toArray).startsWith("invalid close fee: fee_satoshis=99000 sat")) - assert(bob2blockchain.expectMsgType[PublishRawTx].tx === tx) + assert(bob2blockchain.expectMsgType[PublishRawTx].tx.txid === tx.txid) bob2blockchain.expectMsgType[PublishTx] bob2blockchain.expectMsgType[WatchTxConfirmed] } @@ -171,11 +171,11 @@ class NegotiatingStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike test("recv ClosingSigned (invalid sig)") { f => import f._ val aliceCloseSig = alice2bob.expectMsgType[ClosingSigned] - val tx = bob.stateData.asInstanceOf[DATA_NEGOTIATING].commitments.localCommit.publishableTxs.commitTx.tx + val tx = bob.stateData.asInstanceOf[DATA_NEGOTIATING].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx bob ! aliceCloseSig.copy(signature = ByteVector64.Zeroes) val error = bob2alice.expectMsgType[Error] assert(new String(error.data.toArray).startsWith("invalid close signature")) - assert(bob2blockchain.expectMsgType[PublishRawTx].tx === tx) + assert(bob2blockchain.expectMsgType[PublishRawTx].tx.txid === tx.txid) bob2blockchain.expectMsgType[PublishTx] bob2blockchain.expectMsgType[WatchTxConfirmed] } @@ -235,10 +235,10 @@ class NegotiatingStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike test("recv Error") { f => import f._ - val tx = alice.stateData.asInstanceOf[DATA_NEGOTIATING].commitments.localCommit.publishableTxs.commitTx.tx + val tx = alice.stateData.asInstanceOf[DATA_NEGOTIATING].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx alice ! Error(ByteVector32.Zeroes, "oops") awaitCond(alice.stateName == CLOSING) - assert(alice2blockchain.expectMsgType[PublishRawTx].tx === tx) + assert(alice2blockchain.expectMsgType[PublishRawTx].tx.txid === tx.txid) alice2blockchain.expectMsgType[PublishTx] assert(alice2blockchain.expectMsgType[WatchTxConfirmed].txId === tx.txid) } diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/h/ClosingStateSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/h/ClosingStateSpec.scala index 1b2aec42fd..8381c90d7c 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/h/ClosingStateSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/h/ClosingStateSpec.scala @@ -18,7 +18,7 @@ package fr.acinq.eclair.channel.states.h import akka.testkit.{TestFSMRef, TestProbe} import fr.acinq.bitcoin.Crypto.PrivateKey -import fr.acinq.bitcoin.{ByteVector32, Crypto, OutPoint, SatoshiLong, Script, ScriptFlags, Transaction, TxIn, TxOut} +import fr.acinq.bitcoin.{ByteVector32, ByteVector64, Crypto, OutPoint, SatoshiLong, Script, ScriptFlags, Transaction, TxIn, TxOut} import fr.acinq.eclair.TestConstants.{Alice, Bob} import fr.acinq.eclair.blockchain.bitcoind.ZmqWatcher._ import fr.acinq.eclair.blockchain.fee.{FeeratePerKw, FeeratesPerKw} @@ -29,7 +29,7 @@ import fr.acinq.eclair.channel.publish.TxPublisher.{PublishRawTx, PublishTx, Set import fr.acinq.eclair.channel.states.{StateTestsBase, StateTestsTags} import fr.acinq.eclair.payment._ import fr.acinq.eclair.payment.relay.Relayer._ -import fr.acinq.eclair.transactions.Transactions.{AnchorOutputsCommitmentFormat, HtlcSuccessTx, HtlcTimeoutTx} +import fr.acinq.eclair.transactions.Transactions.{AnchorOutputsCommitmentFormat, HtlcSuccessTx, HtlcTimeoutTx, TxOwner} import fr.acinq.eclair.transactions.{Scripts, Transactions} import fr.acinq.eclair.wire.protocol._ import fr.acinq.eclair.{CltvExpiry, MilliSatoshiLong, TestConstants, TestKitBaseClass, randomBytes32, randomKey} @@ -45,7 +45,7 @@ import scala.concurrent.duration._ class ClosingStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with StateTestsBase { - case class FixtureParam(alice: TestFSMRef[State, Data, Channel], bob: TestFSMRef[State, Data, Channel], alice2bob: TestProbe, bob2alice: TestProbe, alice2blockchain: TestProbe, bob2blockchain: TestProbe, relayerA: TestProbe, relayerB: TestProbe, channelUpdateListener: TestProbe, bobCommitTxs: List[PublishableTxs]) + case class FixtureParam(alice: TestFSMRef[State, Data, Channel], bob: TestFSMRef[State, Data, Channel], alice2bob: TestProbe, bob2alice: TestProbe, alice2blockchain: TestProbe, bob2blockchain: TestProbe, relayerA: TestProbe, relayerB: TestProbe, channelUpdateListener: TestProbe, bobCommitTxs: List[CommitTxAndRemoteSig]) override def withFixture(test: OneArgTest): Outcome = { val setup = init() @@ -92,18 +92,18 @@ class ClosingStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with } else { within(30 seconds) { reachNormal(setup, test.tags) - val bobCommitTxs: List[PublishableTxs] = (for (amt <- List(100000000 msat, 200000000 msat, 300000000 msat)) yield { + val bobCommitTxs: List[CommitTxAndRemoteSig] = (for (amt <- List(100000000 msat, 200000000 msat, 300000000 msat)) yield { val (r, htlc) = addHtlc(amt, alice, bob, alice2bob, bob2alice) crossSign(alice, bob, alice2bob, bob2alice) relayerB.expectMsgType[RelayForward] - val bobCommitTx1 = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs + val bobCommitTx1 = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig fulfillHtlc(htlc.id, r, bob, alice, bob2alice, alice2bob) // alice forwards the fulfill upstream relayerA.expectMsgType[RES_ADD_SETTLED[Origin, HtlcResult.Fulfill]] crossSign(bob, alice, bob2alice, alice2bob) // bob confirms that it has forwarded the fulfill to alice awaitCond(bob.underlyingActor.nodeParams.db.pendingCommands.listSettlementCommands(htlc.channelId).isEmpty) - val bobCommitTx2 = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs + val bobCommitTx2 = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig bobCommitTx1 :: bobCommitTx2 :: Nil }).flatten @@ -336,7 +336,7 @@ class ClosingStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with test("recv WatchFundingSpentTriggered (local commit)") { f => import f._ // an error occurs and alice publishes her commit tx - val aliceCommitTx = alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val aliceCommitTx = alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx localClose(alice, alice2blockchain) val initialState = alice.stateData.asInstanceOf[DATA_CLOSING] assert(initialState.localCommitPublished.isDefined) @@ -488,7 +488,7 @@ class ClosingStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with import f._ val listener = TestProbe() system.eventStream.subscribe(listener.ref, classOf[PaymentSettlingOnChain]) - val aliceCommitTx = alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val aliceCommitTx = alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx // alice sends an htlc val (_, htlc) = addHtlc(4200000 msat, alice, bob, alice2bob, bob2alice) // and signs it (but bob doesn't sign it) @@ -517,7 +517,7 @@ class ClosingStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with val (r, htlc) = addHtlc(110000000 msat, bob, alice, bob2alice, alice2bob) crossSign(bob, alice, bob2alice, alice2bob) relayerA.expectMsgType[RelayForward] - val aliceCommitTx = alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val aliceCommitTx = alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx assert(aliceCommitTx.txOut.size === 3) // 2 main outputs + 1 htlc // alice fulfills the HTLC but bob doesn't receive the signature @@ -528,7 +528,7 @@ class ClosingStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with // note that bob doesn't receive the new sig! // then we make alice unilaterally close the channel val closingState = localClose(alice, alice2blockchain) - assert(closingState.commitTx === aliceCommitTx) + assert(closingState.commitTx.txid === aliceCommitTx.txid) assert(getHtlcTimeoutTxs(closingState).isEmpty) assert(getHtlcSuccessTxs(closingState).length === 1) } @@ -618,7 +618,7 @@ class ClosingStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with import f._ val listener = TestProbe() system.eventStream.subscribe(listener.ref, classOf[PaymentSettlingOnChain]) - val bobCommitTx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val bobCommitTx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx // alice sends an htlc val (_, htlc) = addHtlc(4200000 msat, alice, bob, alice2bob, bob2alice) // and signs it (but bob doesn't sign it) @@ -722,7 +722,7 @@ class ClosingStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with crossSign(alice, bob, alice2bob, bob2alice) // Bob publishes the latest commit tx. - val bobCommitTx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val bobCommitTx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx if (channelVersion.hasAnchorOutputs) { assert(bobCommitTx.txOut.length === 7) // two main outputs + two anchors + 3 HTLCs } else { @@ -770,7 +770,7 @@ class ClosingStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with alice2bob.expectMsgType[CommitSig] // We stop here: Alice sent her CommitSig, but doesn't hear back from Bob. // Now Bob publishes the first commit tx (force-close). - val bobCommitTx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val bobCommitTx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx assert(bobCommitTx.txOut.length === 3) // two main outputs + 1 HTLC val closingState = remoteClose(bobCommitTx, alice, alice2blockchain) assert(closingState.claimMainOutputTx.nonEmpty) @@ -810,7 +810,7 @@ class ClosingStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with // alice sends an htlc to bob addHtlc(50000000 msat, alice, bob, alice2bob, bob2alice) crossSign(alice, bob, alice2bob, bob2alice) - val bobCommitTx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val bobCommitTx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx val closingState = remoteClose(bobCommitTx, alice, alice2blockchain) val htlcTimeoutTx = getClaimHtlcTimeoutTxs(closingState).head alice ! WatchTxConfirmedTriggered(0, 0, bobCommitTx) @@ -850,7 +850,7 @@ class ClosingStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with bob2alice.expectMsgType[CommitSig] // not forwarded to Alice (malicious Bob) // Bob publishes the next commit tx. - val bobCommitTx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val bobCommitTx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx if (channelVersion.hasAnchorOutputs) { assert(bobCommitTx.txOut.length === 7) // two main outputs + two anchors + 3 HTLCs } else { @@ -937,7 +937,7 @@ class ClosingStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with bob2alice.expectMsgType[CommitSig] // not forwarded to Alice (malicious Bob) // Now Bob publishes the next commit tx (force-close). - val bobCommitTx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val bobCommitTx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx assert(bobCommitTx.txOut.length === 4) // two main outputs + 2 HTLCs val closingState = remoteClose(bobCommitTx, alice, alice2blockchain) assert(closingState.claimMainOutputTx.nonEmpty) @@ -1030,7 +1030,7 @@ class ClosingStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with // alice now waits for bob to publish its commitment awaitCond(alice.stateName == WAIT_FOR_REMOTE_PUBLISH_FUTURE_COMMITMENT) // bob is nice and publishes its commitment - val bobCommitTx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val bobCommitTx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx if (channelVersion.hasAnchorOutputs) { assert(bobCommitTx.txOut.length === 6) // two main outputs + two anchors + 2 HTLCs } else { @@ -1102,69 +1102,69 @@ class ClosingStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with assert(alice2blockchain.expectMsgType[WatchTxConfirmed].txId === claimMainTx.txid) } - case class RevokedCloseFixture(bobRevokedTxs: Seq[PublishableTxs], htlcsAlice: Seq[(UpdateAddHtlc, ByteVector32)], htlcsBob: Seq[(UpdateAddHtlc, ByteVector32)]) + case class RevokedCloseFixture(bobRevokedTxs: Seq[LocalCommit], htlcsAlice: Seq[(UpdateAddHtlc, ByteVector32)], htlcsBob: Seq[(UpdateAddHtlc, ByteVector32)]) private def prepareRevokedClose(f: FixtureParam, channelVersion: ChannelVersion): RevokedCloseFixture = { import f._ // Bob's first commit tx doesn't contain any htlc - val commitTx1 = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs + val localCommit1 = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit if (channelVersion.hasAnchorOutputs) { - assert(commitTx1.commitTx.tx.txOut.size === 4) // 2 main outputs + 2 anchors + assert(localCommit1.commitTxAndRemoteSig.commitTx.tx.txOut.size === 4) // 2 main outputs + 2 anchors } else { - assert(commitTx1.commitTx.tx.txOut.size === 2) // 2 main outputs + assert(localCommit1.commitTxAndRemoteSig.commitTx.tx.txOut.size === 2) // 2 main outputs } // Bob's second commit tx contains 1 incoming htlc and 1 outgoing htlc - val (commitTx2, htlcAlice1, htlcBob1) = { + val (localCommit2, htlcAlice1, htlcBob1) = { val (ra, htlcAlice) = addHtlc(35000000 msat, alice, bob, alice2bob, bob2alice) crossSign(alice, bob, alice2bob, bob2alice) val (rb, htlcBob) = addHtlc(20000000 msat, bob, alice, bob2alice, alice2bob) crossSign(bob, alice, bob2alice, alice2bob) - val commitTx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs - (commitTx, (htlcAlice, ra), (htlcBob, rb)) + val localCommit = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit + (localCommit, (htlcAlice, ra), (htlcBob, rb)) } - assert(alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx.txOut.size == commitTx2.commitTx.tx.txOut.size) + assert(alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx.txOut.size == localCommit2.commitTxAndRemoteSig.commitTx.tx.txOut.size) if (channelVersion.hasAnchorOutputs) { - assert(commitTx2.commitTx.tx.txOut.size === 6) + assert(localCommit2.commitTxAndRemoteSig.commitTx.tx.txOut.size === 6) } else { - assert(commitTx2.commitTx.tx.txOut.size === 4) + assert(localCommit2.commitTxAndRemoteSig.commitTx.tx.txOut.size === 4) } // Bob's third commit tx contains 2 incoming htlcs and 2 outgoing htlcs - val (commitTx3, htlcAlice2, htlcBob2) = { + val (localCommit3, htlcAlice2, htlcBob2) = { val (ra, htlcAlice) = addHtlc(25000000 msat, alice, bob, alice2bob, bob2alice) crossSign(alice, bob, alice2bob, bob2alice) val (rb, htlcBob) = addHtlc(18000000 msat, bob, alice, bob2alice, alice2bob) crossSign(bob, alice, bob2alice, alice2bob) - val commitTx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs - (commitTx, (htlcAlice, ra), (htlcBob, rb)) + val localCommit = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit + (localCommit, (htlcAlice, ra), (htlcBob, rb)) } - assert(alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx.txOut.size == commitTx3.commitTx.tx.txOut.size) + assert(alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx.txOut.size == localCommit3.commitTxAndRemoteSig.commitTx.tx.txOut.size) if (channelVersion.hasAnchorOutputs) { - assert(commitTx3.commitTx.tx.txOut.size === 8) + assert(localCommit3.commitTxAndRemoteSig.commitTx.tx.txOut.size === 8) } else { - assert(commitTx3.commitTx.tx.txOut.size === 6) + assert(localCommit3.commitTxAndRemoteSig.commitTx.tx.txOut.size === 6) } // Bob's fourth commit tx doesn't contain any htlc - val commitTx4 = { + val localCommit4 = { Seq(htlcAlice1, htlcAlice2).foreach { case (htlcAlice, _) => failHtlc(htlcAlice.id, bob, alice, bob2alice, alice2bob) } Seq(htlcBob1, htlcBob2).foreach { case (htlcBob, _) => failHtlc(htlcBob.id, alice, bob, alice2bob, bob2alice) } crossSign(alice, bob, alice2bob, bob2alice) - bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs + bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit } - assert(alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx.txOut.size == commitTx4.commitTx.tx.txOut.size) + assert(alice.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx.txOut.size == localCommit4.commitTxAndRemoteSig.commitTx.tx.txOut.size) if (channelVersion.hasAnchorOutputs) { - assert(commitTx4.commitTx.tx.txOut.size === 4) + assert(localCommit4.commitTxAndRemoteSig.commitTx.tx.txOut.size === 4) } else { - assert(commitTx4.commitTx.tx.txOut.size === 2) + assert(localCommit4.commitTxAndRemoteSig.commitTx.tx.txOut.size === 2) } - RevokedCloseFixture(Seq(commitTx1, commitTx2, commitTx3, commitTx4), Seq(htlcAlice1, htlcAlice2), Seq(htlcBob1, htlcBob2)) + RevokedCloseFixture(Seq(localCommit1, localCommit2, localCommit3, localCommit4), Seq(htlcAlice1, htlcAlice2), Seq(htlcBob1, htlcBob2)) } private def setupFundingSpentRevokedTx(f: FixtureParam, channelVersion: ChannelVersion): (Transaction, RevokedCommitPublished) = { @@ -1174,7 +1174,7 @@ class ClosingStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with assert(alice.stateData.asInstanceOf[DATA_NORMAL].commitments.channelVersion === channelVersion) // bob publishes one of his revoked txs - val bobRevokedTx = revokedCloseFixture.bobRevokedTxs(1).commitTx.tx + val bobRevokedTx = revokedCloseFixture.bobRevokedTxs(1).commitTxAndRemoteSig.commitTx.tx alice ! WatchFundingSpentTriggered(bobRevokedTx) awaitCond(alice.stateData.isInstanceOf[DATA_CLOSING]) @@ -1257,7 +1257,7 @@ class ClosingStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with test("recv WatchFundingSpentTriggered (multiple revoked tx)") { f => import f._ val revokedCloseFixture = prepareRevokedClose(f, ChannelVersion.STANDARD) - assert(revokedCloseFixture.bobRevokedTxs.map(_.commitTx.tx.txid).toSet.size === revokedCloseFixture.bobRevokedTxs.size) // all commit txs are distinct + assert(revokedCloseFixture.bobRevokedTxs.map(_.commitTxAndRemoteSig.commitTx.tx.txid).toSet.size === revokedCloseFixture.bobRevokedTxs.size) // all commit txs are distinct def broadcastBobRevokedTx(revokedTx: Transaction, htlcCount: Int, revokedCount: Int): RevokedCommitPublished = { alice ! WatchFundingSpentTriggered(revokedTx) @@ -1285,11 +1285,11 @@ class ClosingStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with } // bob publishes a first revoked tx (no htlc in that commitment) - broadcastBobRevokedTx(revokedCloseFixture.bobRevokedTxs.head.commitTx.tx, 0, 1) + broadcastBobRevokedTx(revokedCloseFixture.bobRevokedTxs.head.commitTxAndRemoteSig.commitTx.tx, 0, 1) // bob publishes a second revoked tx - val rvk2 = broadcastBobRevokedTx(revokedCloseFixture.bobRevokedTxs(1).commitTx.tx, 2, 2) + val rvk2 = broadcastBobRevokedTx(revokedCloseFixture.bobRevokedTxs(1).commitTxAndRemoteSig.commitTx.tx, 2, 2) // bob publishes a third revoked tx - broadcastBobRevokedTx(revokedCloseFixture.bobRevokedTxs(2).commitTx.tx, 4, 3) + broadcastBobRevokedTx(revokedCloseFixture.bobRevokedTxs(2).commitTxAndRemoteSig.commitTx.tx, 4, 3) // bob's second revoked tx confirms: once all penalty txs are confirmed, alice can move to the closed state // NB: if multiple txs confirm in the same block, we may receive the events in any order @@ -1341,13 +1341,13 @@ class ClosingStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with val commitmentFormat = alice.stateData.asInstanceOf[DATA_NORMAL].commitments.commitmentFormat // bob publishes one of his revoked txs - val bobRevokedTxs = revokedCloseFixture.bobRevokedTxs(2) - alice ! WatchFundingSpentTriggered(bobRevokedTxs.commitTx.tx) + val bobRevokedCommit = revokedCloseFixture.bobRevokedTxs(2) + alice ! WatchFundingSpentTriggered(bobRevokedCommit.commitTxAndRemoteSig.commitTx.tx) awaitCond(alice.stateData.isInstanceOf[DATA_CLOSING]) awaitCond(alice.stateData.asInstanceOf[DATA_CLOSING].revokedCommitPublished.size == 1) val rvk = alice.stateData.asInstanceOf[DATA_CLOSING].revokedCommitPublished.head - assert(rvk.commitTx === bobRevokedTxs.commitTx.tx) + assert(rvk.commitTx === bobRevokedCommit.commitTxAndRemoteSig.commitTx.tx) if (channelVersion.paysDirectlyToWallet) { assert(rvk.claimMainOutputTx.isEmpty) } else { @@ -1370,14 +1370,14 @@ class ClosingStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with // bob manages to claim 2 htlc outputs before alice can penalize him: 1 htlc-success and 1 htlc-timeout. val (fulfilledHtlc, preimage) = revokedCloseFixture.htlcsAlice.head val (failedHtlc, _) = revokedCloseFixture.htlcsBob.last - val bobHtlcSuccessTx1 = bobRevokedTxs.htlcTxsAndSigs.collectFirst { - case HtlcTxAndSigs(txInfo: HtlcSuccessTx, localSig, remoteSig) if txInfo.htlcId == fulfilledHtlc.id => + val bobHtlcSuccessTx1 = bobRevokedCommit.htlcTxsAndRemoteSigs.collectFirst { + case HtlcTxAndRemoteSig(txInfo: HtlcSuccessTx, remoteSig) if txInfo.htlcId == fulfilledHtlc.id => assert(fulfilledHtlc.paymentHash === txInfo.paymentHash) - Transactions.addSigs(txInfo, localSig, remoteSig, preimage, commitmentFormat) + Transactions.addSigs(txInfo, ByteVector64.Zeroes, ByteVector64.Zeroes, preimage, commitmentFormat) }.get - val bobHtlcTimeoutTx = bobRevokedTxs.htlcTxsAndSigs.collectFirst { - case HtlcTxAndSigs(txInfo: HtlcTimeoutTx, localSig, remoteSig) if txInfo.htlcId == failedHtlc.id => - Transactions.addSigs(txInfo, localSig, remoteSig, commitmentFormat) + val bobHtlcTimeoutTx = bobRevokedCommit.htlcTxsAndRemoteSigs.collectFirst { + case HtlcTxAndRemoteSig(txInfo: HtlcTimeoutTx, remoteSig) if txInfo.htlcId == failedHtlc.id => + Transactions.addSigs(txInfo, ByteVector64.Zeroes, ByteVector64.Zeroes, commitmentFormat) }.get val bobOutpoints = Seq(bobHtlcSuccessTx1, bobHtlcTimeoutTx).map(_.input.outPoint).toSet assert(bobOutpoints.size === 2) @@ -1456,13 +1456,14 @@ class ClosingStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with // bob publishes one of his revoked txs val revokedCloseFixture = prepareRevokedClose(f, ChannelVersion.ANCHOR_OUTPUTS) - val bobRevokedTxs = revokedCloseFixture.bobRevokedTxs(2) - alice ! WatchFundingSpentTriggered(bobRevokedTxs.commitTx.tx) + val bobRevokedCommit = revokedCloseFixture.bobRevokedTxs(2) + val commitmentFormat = alice.stateData.asInstanceOf[DATA_NORMAL].commitments.commitmentFormat + alice ! WatchFundingSpentTriggered(bobRevokedCommit.commitTxAndRemoteSig.commitTx.tx) awaitCond(alice.stateData.isInstanceOf[DATA_CLOSING]) assert(alice.stateData.asInstanceOf[DATA_CLOSING].commitments.commitmentFormat === AnchorOutputsCommitmentFormat) awaitCond(alice.stateData.asInstanceOf[DATA_CLOSING].revokedCommitPublished.size == 1) val rvk = alice.stateData.asInstanceOf[DATA_CLOSING].revokedCommitPublished.head - assert(rvk.commitTx === bobRevokedTxs.commitTx.tx) + assert(rvk.commitTx === bobRevokedCommit.commitTxAndRemoteSig.commitTx.tx) assert(rvk.htlcPenaltyTxs.size === 4) assert(rvk.claimHtlcDelayedPenaltyTxs.isEmpty) @@ -1475,12 +1476,17 @@ class ClosingStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with // bob claims multiple htlc outputs in a single transaction (this is possible with anchor outputs because signatures // use sighash_single | sighash_anyonecanpay) - val bobHtlcTxs = bobRevokedTxs.htlcTxsAndSigs.collect { - case HtlcTxAndSigs(txInfo: HtlcSuccessTx, localSig, remoteSig) => + val bobKeyManager = bob.underlyingActor.nodeParams.channelKeyManager + val bobChannelKeyPath = bobKeyManager.keyPath(bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localParams, ChannelVersion.ANCHOR_OUTPUTS) + val bobPerCommitmentPoint = bobKeyManager.commitmentPoint(bobChannelKeyPath, bobRevokedCommit.index.toInt) + val bobHtlcTxs = bobRevokedCommit.htlcTxsAndRemoteSigs.collect { + case HtlcTxAndRemoteSig(txInfo: HtlcSuccessTx, remoteSig) => val preimage = revokedCloseFixture.htlcsAlice.collectFirst { case (add, preimage) if add.id == txInfo.htlcId => preimage }.get assert(Crypto.sha256(preimage) === txInfo.paymentHash) + val localSig = bobKeyManager.sign(txInfo, bobKeyManager.htlcPoint(bobChannelKeyPath), bobPerCommitmentPoint, TxOwner.Local, commitmentFormat) Transactions.addSigs(txInfo, localSig, remoteSig, preimage, AnchorOutputsCommitmentFormat) - case HtlcTxAndSigs(txInfo: HtlcTimeoutTx, localSig, remoteSig) => + case HtlcTxAndRemoteSig(txInfo: HtlcTimeoutTx, remoteSig) => + val localSig = bobKeyManager.sign(txInfo, bobKeyManager.htlcPoint(bobChannelKeyPath), bobPerCommitmentPoint, TxOwner.Local, commitmentFormat) Transactions.addSigs(txInfo, localSig, remoteSig, AnchorOutputsCommitmentFormat) } assert(bobHtlcTxs.map(_.input.outPoint).size === 4) @@ -1532,14 +1538,14 @@ class ClosingStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with import f._ assert(alice.stateData.asInstanceOf[DATA_NORMAL].commitments.channelVersion === channelVersion) val initOutputCount = if (channelVersion.hasAnchorOutputs) 4 else 2 - assert(bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx.txOut.size === initOutputCount) + assert(bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx.txOut.size === initOutputCount) // bob's second commit tx contains 2 incoming htlcs val (bobRevokedTx, htlcs1) = { val (_, htlc1) = addHtlc(35000000 msat, alice, bob, alice2bob, bob2alice) val (_, htlc2) = addHtlc(20000000 msat, alice, bob, alice2bob, bob2alice) crossSign(alice, bob, alice2bob, bob2alice) - val bobCommitTx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx + val bobCommitTx = bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx assert(bobCommitTx.txOut.size === initOutputCount + 2) (bobCommitTx, Seq(htlc1, htlc2)) } @@ -1550,7 +1556,7 @@ class ClosingStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with val (_, htlc4) = addHtlc(18000000 msat, alice, bob, alice2bob, bob2alice) failHtlc(htlcs1.head.id, bob, alice, bob2alice, alice2bob) crossSign(bob, alice, bob2alice, alice2bob) - assert(bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.publishableTxs.commitTx.tx.txOut.size === initOutputCount + 3) + assert(bob.stateData.asInstanceOf[DATA_NORMAL].commitments.localCommit.commitTxAndRemoteSig.commitTx.tx.txOut.size === initOutputCount + 3) Seq(htlc3, htlc4) } diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/integration/ChannelIntegrationSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/integration/ChannelIntegrationSpec.scala index 1495fec0ad..0f851a24b4 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/integration/ChannelIntegrationSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/integration/ChannelIntegrationSpec.scala @@ -34,6 +34,7 @@ import fr.acinq.eclair.payment.receive.{ForwardHandler, PaymentHandler} import fr.acinq.eclair.payment.send.MultiPartPaymentLifecycle.PreimageReceived import fr.acinq.eclair.payment.send.PaymentInitiator.SendPayment import fr.acinq.eclair.router.Router +import fr.acinq.eclair.transactions.Transactions.TxOwner import fr.acinq.eclair.transactions.{Scripts, Transactions} import fr.acinq.eclair.wire.protocol.{ChannelAnnouncement, ChannelUpdate, PermanentChannelFailure, UpdateAddHtlc} import fr.acinq.eclair.{MilliSatoshi, MilliSatoshiLong, randomBytes32} @@ -393,13 +394,13 @@ abstract class ChannelIntegrationSpec extends IntegrationSpec { sigListener.expectNoMsg(1 second) assert(commitmentsF.commitmentFormat === commitmentFormat) // in this commitment, both parties should have a main output, there are four pending htlcs and anchor outputs if applicable - val localCommitF = commitmentsF.localCommit.publishableTxs + val localCommitF = commitmentsF.localCommit commitmentFormat match { - case Transactions.DefaultCommitmentFormat => assert(localCommitF.commitTx.tx.txOut.size === 6) - case Transactions.AnchorOutputsCommitmentFormat => assert(localCommitF.commitTx.tx.txOut.size === 8) + case Transactions.DefaultCommitmentFormat => assert(localCommitF.commitTxAndRemoteSig.commitTx.tx.txOut.size === 6) + case Transactions.AnchorOutputsCommitmentFormat => assert(localCommitF.commitTxAndRemoteSig.commitTx.tx.txOut.size === 8) } - val htlcTimeoutTxs = localCommitF.htlcTxsAndSigs.collect { case h@HtlcTxAndSigs(_: Transactions.HtlcTimeoutTx, _, _) => h } - val htlcSuccessTxs = localCommitF.htlcTxsAndSigs.collect { case h@HtlcTxAndSigs(_: Transactions.HtlcSuccessTx, _, _) => h } + val htlcTimeoutTxs = localCommitF.htlcTxsAndRemoteSigs.collect { case h@HtlcTxAndRemoteSig(_: Transactions.HtlcTimeoutTx, _) => h } + val htlcSuccessTxs = localCommitF.htlcTxsAndRemoteSigs.collect { case h@HtlcTxAndRemoteSig(_: Transactions.HtlcSuccessTx, _) => h } assert(htlcTimeoutTxs.size === 2) assert(htlcSuccessTxs.size === 2) // we fulfill htlcs to get the preimages @@ -429,9 +430,23 @@ abstract class ChannelIntegrationSpec extends IntegrationSpec { sender.send(nodes("C").register, Register.Forward(sender.ref, commitmentsF.channelId, CMD_GETSTATEDATA(ActorRef.noSender))) val finalAddressC = scriptPubKeyToAddress(sender.expectMsgType[RES_GETSTATEDATA[DATA_NORMAL]].data.commitments.localParams.defaultFinalScriptPubKey) // we prepare the revoked transactions F will publish - val revokedCommitTx = localCommitF.commitTx.tx - val htlcSuccess = htlcSuccessTxs.zip(Seq(preimage1, preimage2)).map { case (htlcTxAndSigs, preimage) => Transactions.addSigs(htlcTxAndSigs.txinfo.asInstanceOf[Transactions.HtlcSuccessTx], htlcTxAndSigs.localSig, htlcTxAndSigs.remoteSig, preimage, commitmentsF.commitmentFormat).tx } - val htlcTimeout = htlcTimeoutTxs.map(htlcTxAndSigs => Transactions.addSigs(htlcTxAndSigs.txinfo.asInstanceOf[Transactions.HtlcTimeoutTx], htlcTxAndSigs.localSig, htlcTxAndSigs.remoteSig, commitmentsF.commitmentFormat).tx) + val keyManagerF = nodes("F").nodeParams.channelKeyManager + val channelKeyPathF = keyManagerF.keyPath(commitmentsF.localParams, commitmentsF.channelVersion) + val localPerCommitmentPointF = keyManagerF.commitmentPoint(channelKeyPathF, commitmentsF.localCommit.index.toInt) + val revokedCommitTx = { + val commitTx = localCommitF.commitTxAndRemoteSig.commitTx + val localSig = keyManagerF.sign(commitTx, keyManagerF.fundingPublicKey(commitmentsF.localParams.fundingKeyPath), TxOwner.Local, commitmentFormat) + Transactions.addSigs(commitTx, keyManagerF.fundingPublicKey(commitmentsF.localParams.fundingKeyPath).publicKey, commitmentsF.remoteParams.fundingPubKey, localSig, localCommitF.commitTxAndRemoteSig.remoteSig).tx + } + val htlcSuccess = htlcSuccessTxs.zip(Seq(preimage1, preimage2)).map { + case (htlcTxAndSigs, preimage) => + val localSig = keyManagerF.sign(htlcTxAndSigs.htlcTx, keyManagerF.htlcPoint(channelKeyPathF), localPerCommitmentPointF, TxOwner.Local, commitmentFormat) + Transactions.addSigs(htlcTxAndSigs.htlcTx.asInstanceOf[Transactions.HtlcSuccessTx], localSig, htlcTxAndSigs.remoteSig, preimage, commitmentsF.commitmentFormat).tx + } + val htlcTimeout = htlcTimeoutTxs.map { htlcTxAndSigs => + val localSig = keyManagerF.sign(htlcTxAndSigs.htlcTx, keyManagerF.htlcPoint(channelKeyPathF), localPerCommitmentPointF, TxOwner.Local, commitmentFormat) + Transactions.addSigs(htlcTxAndSigs.htlcTx.asInstanceOf[Transactions.HtlcTimeoutTx], localSig, htlcTxAndSigs.remoteSig, commitmentsF.commitmentFormat).tx + } htlcSuccess.foreach(tx => Transaction.correctlySpends(tx, Seq(revokedCommitTx), ScriptFlags.STANDARD_SCRIPT_VERIFY_FLAGS)) htlcTimeout.foreach(tx => Transaction.correctlySpends(tx, Seq(revokedCommitTx), ScriptFlags.STANDARD_SCRIPT_VERIFY_FLAGS)) RevokedCommitFixture(sender, stateListenerC, revokedCommitTx, htlcSuccess, htlcTimeout, finalAddressC) @@ -658,7 +673,7 @@ class AnchorOutputChannelIntegrationSpec extends ChannelIntegrationSpec { val toRemoteAddress = Script.pay2wsh(Scripts.toRemoteDelayed(initialStateDataF.commitments.remoteParams.paymentBasepoint)) // toRemote output of C as seen by F - val Some(toRemoteOutC) = initialStateDataF.commitments.localCommit.publishableTxs.commitTx.tx.txOut.find(_.publicKeyScript == Script.write(toRemoteAddress)) + val Some(toRemoteOutC) = initialStateDataF.commitments.localCommit.commitTxAndRemoteSig.commitTx.tx.txOut.find(_.publicKeyScript == Script.write(toRemoteAddress)) // let's make a payment to advance the commit index val amountMsat = 4200000.msat @@ -683,7 +698,7 @@ class AnchorOutputChannelIntegrationSpec extends ChannelIntegrationSpec { sender.send(nodes("F").register, Register.Forward(sender.ref, channelId, CMD_GETSTATEDATA(ActorRef.noSender))) val stateDataF = sender.expectMsgType[RES_GETSTATEDATA[DATA_NORMAL]].data val commitmentIndex = stateDataF.commitments.localCommit.index - val commitTx = stateDataF.commitments.localCommit.publishableTxs.commitTx.tx + val commitTx = stateDataF.commitments.localCommit.commitTxAndRemoteSig.commitTx.tx val Some(toRemoteOutCNew) = commitTx.txOut.find(_.publicKeyScript == Script.write(toRemoteAddress)) // there is a new commitment index in the channel state diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/wire/internal/channel/ChannelCodecsSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/wire/internal/channel/ChannelCodecsSpec.scala index b9cc648064..07467683b1 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/wire/internal/channel/ChannelCodecsSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/wire/internal/channel/ChannelCodecsSpec.scala @@ -18,7 +18,7 @@ package fr.acinq.eclair.wire.internal.channel import com.google.common.net.HostAndPort import fr.acinq.bitcoin.Crypto.{PrivateKey, PublicKey} -import fr.acinq.bitcoin.{Block, ByteVector32, ByteVector64, Crypto, DeterministicWallet, OutPoint, Satoshi, SatoshiLong, Transaction} +import fr.acinq.bitcoin.{Block, ByteVector32, ByteVector64, Crypto, DeterministicWallet, OutPoint, Satoshi, SatoshiLong, Transaction, TxIn} import fr.acinq.eclair._ import fr.acinq.eclair.blockchain.fee.FeeratePerKw import fr.acinq.eclair.channel.Helpers.Funding @@ -26,7 +26,7 @@ import fr.acinq.eclair.channel._ import fr.acinq.eclair.crypto.ShaChain import fr.acinq.eclair.crypto.keymanager.{LocalChannelKeyManager, LocalNodeKeyManager} import fr.acinq.eclair.router.Announcements -import fr.acinq.eclair.transactions.Transactions.{AnchorOutputsCommitmentFormat, CommitTx, InputInfo, TransactionWithInputInfo} +import fr.acinq.eclair.transactions.Transactions.{AnchorOutputsCommitmentFormat, CommitTx, InputInfo, TransactionWithInputInfo, TxOwner} import fr.acinq.eclair.transactions._ import fr.acinq.eclair.wire.internal.channel.ChannelCodecs._ import fr.acinq.eclair.wire.protocol.UpdateAddHtlc @@ -54,26 +54,25 @@ class ChannelCodecsSpec extends AnyFunSuite { val c = ChannelCodecs.stateDataCodec.decode(bin.toBitVector).require.value val ref = Seq( - (hex"30440220104aed8d52fe50e2313a9a456607838a0cdac75fdc37afe581c415e7a20da944022034d1ac69c64f34571251be8cc6b50116f26453813267fb9afa3e318a79f4f32401", hex"304502210097fcda40b22916b5d61badedf6126658c2b5927d5002cc2c3e5f88a78ba5f45b02204a74bcf8827d894cab153fc051f39d8e2aeb660162a6a05797f7140587a6133301"), - (hex"30450221009e0e57886b81fd4159f672728891d799203b23c351e93134aba445b288443d3502207b77faa4227126b7d087144c75f4e5c8af9db705b37806dbd2d3f4339666d32201", hex"3045022100aa403fa23e82379a16ba16b446dbdee5a4f879ba690ad3f4f10dc445df2832ba022000a51fdbdb69dcbd5518274303fcece60d719cb6d593e882fdb0190253bbaaab01"), - (hex"3045022100fb44e66fc294d9ece2c33465398221edcfd857208d32a36dedab9906d00b356d022008c5fcfa7b41f8616d57ed009a8614aca636edae1479b6114e03407ba6fceea701", hex"3045022100a9ad65dada5e5500897173bca610135a13008895ce445fbc90d440d5406bd6150220644d75e5ca774ef6b559ffaf1083a9a5da250c3c87666d96daf35b480ef0c65701"), - (hex"3044022009e4f39656dc8712863bffe2acdfa4d2245f65f38a230dd034b226dc2e5fd7ce022049c0108e44c399d1a1b67ab6f60566f491d8682406ac4a03a914f9a21196d6ba01", hex"3044022063a6839c031fd5534d7807a8fff8ca0f9a72d8aa9d78ee104d6ece2b417ac5ce0220193d9b521a44011d31d2bb85be5043119c42a7aee3d9ef68b7388c3c9c3a780501"), - (hex"304402207eaf435948b9e04cb6551f97ee5d85ac879e20d3fae3f5c9a0880ef452d32ac902206e9c5c9098c3e3bef010d3142578823c7fb43b43fe0a0036d481f18a0168b20f01", hex"304402205dda44c9d8aaf37a6f5f6c99713d2a001682f2593a960ccaf5c23059cd20016b02200991b09bccdfc87918852650a4bfa7b4ac9028101362631b5ec376427084138e01"), - (hex"304402200232dbb9d46dabc6569f3f65f4f2a4b7e5acf7be85687b9897141e9784cb9d370220087b2c1dda444d7351976135b56f2f2ca22d8c03d5aa40acbce8c4241daf541501", hex"3045022100eddaa4f767bc70fd672bee983b1644dbff9479def0efc7cca79f0daa1bad370d02204c810238968ae9e86b99d348464e9ac7a06e40225022ae4203ae36fad928c22401"), - (hex"3045022100daa604934db542aa5a9bcbd48eb666fac8acdee92ccd8d42228f52377c51184a022069f855477b27cec39b15fb9e666c09b6c4860c8b80cd1315d2498d97d9cf024601", hex"3044022020e6d43dee03f54574d8245edf2e312d0a492dd2350b7f8df68390b8876de5640220555d46cd545ff0ecc280e6bc82e976ff494bab5f2b128807626753ffb9e5796e01"), - (hex"3044022046c3cf88f9e8639c954c584725482dd6e6403deda3824c37ae95db9bf99d341602206432f76c5ca3d61951155c1b223fd35dd4227f83e1ff9a93437b63515567d23f01", hex"3045022100812a360a6ddc44179f80e5b4252bca74bb5dbe1da25230c9e8afcd388a2fd64702202e45a658123f0263ca1157ef9a9995ede1625d1ecba532957185f1d8044aa1d301"), - (hex"30440220482df018e51b4f684271682bc3c81c481d288d61000a77df2126afe042c3471d02204772720ff1ea323a271259022a0458ae4d228e5f613ade63fca38eb5d443756a01", hex"3044022076a338d225b8954412198ce5936aaa6433da1f51dd9bcbe69d95a1e0960c169802207db267517fc73e358e09f4c89313ae17ed4d5f6d8432faec9ec1e784a2a7da7c01"), - (hex"3045022100916255b5758d66cd46f653f8a5a71b1c857bfae1a7cf85195b5d78476c4138c502200101e3ec9874aa2644691662bf8945a182af1237bb61c459e9dbff495b9097d001", hex"304402201d099a464a7696b22a8e58b65c52e9a519a06a5c49e944155d4e5fbd14d3f5b902203c091c0ec5b840a80be739d29b5fc2c75cb94928e5ea83133f84d226f28cd4b701"), - (hex"3045022100d8eaa436faec6b38f155065893f1212ce43615fbec49b4af72f16119774b5472022033aa303992f4a8cfe1c77e6a0d2baa73baad0305a88da16d26122e536867431101", hex"304402203af7b7ea16cc018fdb414f52cd38ed548dc257cbb06c812c9dc1d60500b21485022072cd74b7e49bfd813e09bae778da903b44b7b0ae22b87af4c34cf8bb77dfdef201"), - (hex"304402204f5dd042bfb449c522012a2d461e5a94c9ea3be629c0ab091b0e1f5569eb119c022021411ff8affabab12cd39f0eaa64f1b08fa72ada6f37d1d46c6bde4483d869fb01", hex"3044022043573edb37be815d1b97b90803f601dfc91c25279ccda606ad6515fee721fe57022030ac2883408a2075a47337443eb539062a8ac6b5453befb2b9863d697e35dd8201"), - (hex"3044022030ff3d4d42ef1c3d742164a30ff7b021215e881d9277a52a1720514a4473289502204b090f6b412e8caacb5bcbf295babb075d9d5490e3f7678c289206780f6f0bc901", hex"304502210093fd7dfa3ef6cdf5b94cfadf83022be98062d53cd7097a73947453b210a481eb0220622e63a21b787ea7bb55f01ab6fe503fcb8ef4cb65adce7a264ae014403646fe01") + hex"304502210097fcda40b22916b5d61badedf6126658c2b5927d5002cc2c3e5f88a78ba5f45b02204a74bcf8827d894cab153fc051f39d8e2aeb660162a6a05797f7140587a6133301", + hex"3045022100aa403fa23e82379a16ba16b446dbdee5a4f879ba690ad3f4f10dc445df2832ba022000a51fdbdb69dcbd5518274303fcece60d719cb6d593e882fdb0190253bbaaab01", + hex"3045022100a9ad65dada5e5500897173bca610135a13008895ce445fbc90d440d5406bd6150220644d75e5ca774ef6b559ffaf1083a9a5da250c3c87666d96daf35b480ef0c65701", + hex"3044022063a6839c031fd5534d7807a8fff8ca0f9a72d8aa9d78ee104d6ece2b417ac5ce0220193d9b521a44011d31d2bb85be5043119c42a7aee3d9ef68b7388c3c9c3a780501", + hex"304402205dda44c9d8aaf37a6f5f6c99713d2a001682f2593a960ccaf5c23059cd20016b02200991b09bccdfc87918852650a4bfa7b4ac9028101362631b5ec376427084138e01", + hex"3045022100eddaa4f767bc70fd672bee983b1644dbff9479def0efc7cca79f0daa1bad370d02204c810238968ae9e86b99d348464e9ac7a06e40225022ae4203ae36fad928c22401", + hex"3044022020e6d43dee03f54574d8245edf2e312d0a492dd2350b7f8df68390b8876de5640220555d46cd545ff0ecc280e6bc82e976ff494bab5f2b128807626753ffb9e5796e01", + hex"3045022100812a360a6ddc44179f80e5b4252bca74bb5dbe1da25230c9e8afcd388a2fd64702202e45a658123f0263ca1157ef9a9995ede1625d1ecba532957185f1d8044aa1d301", + hex"3044022076a338d225b8954412198ce5936aaa6433da1f51dd9bcbe69d95a1e0960c169802207db267517fc73e358e09f4c89313ae17ed4d5f6d8432faec9ec1e784a2a7da7c01", + hex"304402201d099a464a7696b22a8e58b65c52e9a519a06a5c49e944155d4e5fbd14d3f5b902203c091c0ec5b840a80be739d29b5fc2c75cb94928e5ea83133f84d226f28cd4b701", + hex"304402203af7b7ea16cc018fdb414f52cd38ed548dc257cbb06c812c9dc1d60500b21485022072cd74b7e49bfd813e09bae778da903b44b7b0ae22b87af4c34cf8bb77dfdef201", + hex"3044022043573edb37be815d1b97b90803f601dfc91c25279ccda606ad6515fee721fe57022030ac2883408a2075a47337443eb539062a8ac6b5453befb2b9863d697e35dd8201", + hex"304502210093fd7dfa3ef6cdf5b94cfadf83022be98062d53cd7097a73947453b210a481eb0220622e63a21b787ea7bb55f01ab6fe503fcb8ef4cb65adce7a264ae014403646fe01" ) val sigs = c.commitments .localCommit - .publishableTxs - .htlcTxsAndSigs - .map(data => (Scripts.der(data.localSig), Scripts.der(data.remoteSig))) + .htlcTxsAndRemoteSigs + .map(data => Scripts.der(data.remoteSig)) assert(ref === sigs) } @@ -90,7 +89,7 @@ class ChannelCodecsSpec extends AnyFunSuite { // and re-encode it with the new codec val bin_new = ByteVector(stateDataCodec.encode(data_new).require.toByteVector.toArray) // data should now be encoded under the new format - assert(bin_new.startsWith(hex"020000")) + assert(bin_new.startsWith(hex"030000")) // now let's decode it again val data_new2 = stateDataCodec.decode(bin_new.toBitVector).require.value // data should match perfectly @@ -99,17 +98,17 @@ class ChannelCodecsSpec extends AnyFunSuite { test("backward compatibility DATA_NORMAL_COMPAT_03_Codec (roundtrip)") { val oldbins = List( - hex"00000303af0ed6052cf28d670665549bc86f4b721c9fdb309d40c58f5811f63966e005d000010000002a000000000000022200000000000000320000000000002710000000000000c3500090003280000001b337b78001b130b90193d163e9dd3a94d6be66a6919dff41e3af5437e98ae8a50576cb25ecd213c3be00000000000001110000000000000019000000000000138800000000000061a800480019018dc262ab3d8932204cae9f6ad55d02b2eb8f0c1a30240cffce0bfaf4eaee83c78126a5b6689b0819654de9575cec805526a2ecf56c0564a119ba6228d392a683b301298ff303409a281e9391899913e433d647d3641e29bf4d2261e2dedee58ff19b81a313bcd6a5569ca8a30a3a8d38842f978870e3d2c9f2701877dadc390e72ad8581f80350c6ab29e276fa9c8ff91d30f81ffc1e91bf44077308c3fd4f9bcd0147050001b337b78001b130b900800000000000000000028000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b71b01922a9715e7ecc3ce2bdd1365f5bb21031ea449de9266835e03cf9cc53b28242c000007dc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e8480ccd0f55bf0c57aeed91f83171d3f1c40112e290addc467672054b23a1abe524a000003e8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d09009f4fb68f3e1dac82202f9aa581ce0bbf1f765df0e9ac3c8c57e20f685abab8ed000001f8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f42403966b742116203fdb684c348788985bef6bf617bfaf0e985ecea90f80a9b1bc9800000fa8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007a1201d61deed074e4ed7ee11573983b363768007418c5925ac537e9fe25595bbb2928000007d800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017700000000000030d4000000000002ab9800092fbd9f938bee777bacd1865cf35318aaecd4142c6b75dca656e082d61292212240000000000ae025a6000000000008800817a7b675021fe0a85125af89ae10ba5a3e6b8b9978cc7f64fee5f87d7195de4d0011d48840c6e131559ec4991026574fb56aae815975c7860d1812067fe705fd7a757741e3c840ebf48a79768b3055b47ee4a708afda1e1e46b6b495d18538707977b35969c68dd4ab80028080000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b8d80c9154b8af3f661e715ee89b2fadd90818f5224ef493341af01e7ce629d941216000003ee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f424066687aadf862bd776c8fc18b8e9f8e20089714856ee233b3902a591d0d5f2925000001f4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e84804fa7db479f0ed6411017cd52c0e705df8fbb2ef874d61e462bf107b42d5d5c76800000fc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007a1201cb35ba108b101fedb4261a43c44c2df7b5fb0bdfd7874c2f675487c054d8de4c000007d4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d0900eb0ef7683a7276bf708ab9cc1d9b1bb4003a0c62c92d629bf4ff12acaddd9494000003ec0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb800000000000186a00000000000155cc00606060606060606060606060606060606060606060606060606060606060606068c4ef35a955a72a28c28ea34e210be5e21c38f4b27c9c061df6b70e439cab61600000000000000000000000000000000000000000000000000000000000400000000000000540002000000000000753000048484848484848484848484848484848484848484848484848484848484848484000000000000005600000000014fb1800000000001312d0102ffbfb9dfb84acd2c2e3100054402a6c713d9b5d9d0865c7723fc56c3ea26f9490024bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b820b584a48848900000000002b80969800000000002200205e9ed9d4087f82a14496be26b842e968f9ae2e65e331fd93fb97e1f5c657793400475221031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f2103afd229e5da2cc156d1fb929c22bf6878791adad2574614e1c1e5decd65a71a3752ae00000000000000000000000000000000000000000000000000000000000000000000000000000000001562095db1aa5fca1c46275348acc0f071419b58ebfb86f5fcb03882bcf441b528869a358d38c9e68ae24a37d198d6a022de4c8a70264cff735f47c6314f3e9e6482095db1aa5fca1c46275348acc0f071419b58ebfb86f5fcb03882bcf441b528869a358d38c9e68ae24a37d198d6a022de4c8a70264cff735f47c6314f3e9e6482095db1aa5fca1c46275348acc0f071419b58ebfb86f5fcb03882bcf441b528869a358d38c9e68ae24a37d198d6a022de4c8a70264cff735f47c6314f3e9e6482095db1aa5fca1c46275348acc0f071419b58ebfb86f5fcb03882bcf441b528869a358d38c9e68ae24a37d198d6a022de4c8a70264cff735f47c6314f3e9e6480000dfc518156de366e5834d448d5cc7ee9f263d06cbc2b41138d1ac320000000000000002000004000606a2e9ffc3c021237b3133e0084ad9fe3f03a39c8f97fb77a7fdab79d1979e7d3007fbb20f299bd8046d496629a8467f571378e55960302b1f42b71e2a5bdf44c34c079b41e9a6ddb5d42e218fb2a8cedbf2a730a0ecaea800f1a8319a94cc59be940a0434a3aeeaf6b2c02b9496df043026c7aca1865942915d15fba51c40ae196a6911294617c9ae1b6c5c076a183fa7fc371b3c5fc458fc99b2f5867cd5c4786c3a005cc1872cdd819fdb48b146b83ecd890797bfe09098635fa6b86aeeeb5ad395b8222222222222222222222222222222222222222222222222222222222222222200000000000459b2ba247fea00020054000000000000001e0000047e0000006b5c858d4a8c72ab8fa1f966ada74456261df6a8bb73867063c275254b297ff56b002af83f5a05bd93af024e990f60db85ff40e59b03548e5316f1647c2a72efe8d16cdc736211c124bd66ae4200", - hex"00000303af0ed6052cf28d670665549bc86f4b721c9fdb309d40c58f5811f63966e005d000010000002a000000000000022200000000000000320000000000002710000000000000c3500090003280000001b337b78001b130b90193d163e9dd3a94d6be66a6919dff41e3af5437e98ae8a50576cb25ecd213c3be00000000000001110000000000000019000000000000138800000000000061a800480019018dc262ab3d8932204cae9f6ad55d02b2eb8f0c1a30240cffce0bfaf4eaee83c78126a5b6689b0819654de9575cec805526a2ecf56c0564a119ba6228d392a683b301298ff303409a281e9391899913e433d647d3641e29bf4d2261e2dedee58ff19b81a313bcd6a5569ca8a30a3a8d38842f978870e3d2c9f2701877dadc390e72ad8581f80350c6ab29e276fa9c8ff91d30f81ffc1e91bf44077308c3fd4f9bcd0147050001b337b78001b130b900800000000000000000028000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b71b01922a9715e7ecc3ce2bdd1365f5bb21031ea449de9266835e03cf9cc53b28242c000007dc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e8480ccd0f55bf0c57aeed91f83171d3f1c40112e290addc467672054b23a1abe524a000003e8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d09009f4fb68f3e1dac82202f9aa581ce0bbf1f765df0e9ac3c8c57e20f685abab8ed000001f8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f42403966b742116203fdb684c348788985bef6bf617bfaf0e985ecea90f80a9b1bc9800000fa8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007a1201d61deed074e4ed7ee11573983b363768007418c5925ac537e9fe25595bbb2928000007d800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017700000000000030d4000000000002ab9800092fbd9f938bee777bacd1865cf35318aaecd4142c6b75dca656e082d61292212240000000000ae025a6000000000008800817a7b675021fe0a85125af89ae10ba5a3e6b8b9978cc7f64fee5f87d7195de4d0011d48840c6e131559ec4991026574fb56aae815975c7860d1812067fe705fd7a757741e3c840ebf48a79768b3055b47ee4a708afda1e1e46b6b495d18538707977b35969c68dd4ab80028080000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b8d80c9154b8af3f661e715ee89b2fadd90818f5224ef493341af01e7ce629d941216000003ee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f424066687aadf862bd776c8fc18b8e9f8e20089714856ee233b3902a591d0d5f2925000001f4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e84804fa7db479f0ed6411017cd52c0e705df8fbb2ef874d61e462bf107b42d5d5c76800000fc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007a1201cb35ba108b101fedb4261a43c44c2df7b5fb0bdfd7874c2f675487c054d8de4c000007d4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d0900eb0ef7683a7276bf708ab9cc1d9b1bb4003a0c62c92d629bf4ff12acaddd9494000003ec0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb800000000000186a00000000000155cc00606060606060606060606060606060606060606060606060606060606060606068c4ef35a955a72a28c28ea34e210be5e21c38f4b27c9c061df6b70e439cab61600000000000000000000000000000000000000000000000000000000000400000000000000540002000000000000753000048484848484848484848484848484848484848484848484848484848484848484000000000000005600000000014fb1800000000001312d0102ffbfb9dfb84acd2c2e3100054402a6c713d9b5d9d0865c7723fc56c3ea26f9490024bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b820b584a48848900000000002b80969800000000002200205e9ed9d4087f82a14496be26b842e968f9ae2e65e331fd93fb97e1f5c657793400475221031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f2103afd229e5da2cc156d1fb929c22bf6878791adad2574614e1c1e5decd65a71a3752ae00000000000000000000000000000000000000000000000000000000000000000000000000000000001562095db1aa5fca1c46275348acc0f071419b58ebfb86f5fcb03882bcf441b528869a358d38c9e68ae24a37d198d6a022de4c8a70264cff735f47c6314f3e9e6482095db1aa5fca1c46275348acc0f071419b58ebfb86f5fcb03882bcf441b528869a358d38c9e68ae24a37d198d6a022de4c8a70264cff735f47c6314f3e9e6482095db1aa5fca1c46275348acc0f071419b58ebfb86f5fcb03882bcf441b528869a358d38c9e68ae24a37d198d6a022de4c8a70264cff735f47c6314f3e9e6482095db1aa5fca1c46275348acc0f071419b58ebfb86f5fcb03882bcf441b528869a358d38c9e68ae24a37d198d6a022de4c8a70264cff735f47c6314f3e9e6480000dfc518156de366e5834d448d5cc7ee9f263d06cbc2b41138d1ac320000000000000002000004000606a2e9ffc3c021237b3133e0084ad9fe3f03a39c8f97fb77a7fdab79d1979e7d3007fbb20f299bd8046d496629a8467f571378e55960302b1f42b71e2a5bdf44c34c079b41e9a6ddb5d42e218fb2a8cedbf2a730a0ecaea800f1a8319a94cc59be940a0434a3aeeaf6b2c02b9496df043026c7aca1865942915d15fba51c40ae196a6911294617c9ae1b6c5c076a183fa7fc371b3c5fc458fc99b2f5867cd5c4786c3a005cc1872cdd819fdb48b146b83ecd890797bfe09098635fa6b86aeeeb5ad395b8222222222222222222222222222222222222222222222222222222222222222200000000000459b2ba247fea00020054000000000000001e0000047e0000006b5c858d4a8c72ab8fa1f966ada74456261df6a8bb73867063c275254b297ff56b002af83f5a05bd93af024e990f60db85ff40e59b03548e5316f1647c2a72efe8d16cdc736211c124bd66ae4200", - hex"00000303af0ed6052cf28d670665549bc86f4b721c9fdb309d40c58f5811f63966e005d000010000002a000000000000022200000000000000320000000000002710000000000000c3500090003280000001b337b78001b130b90193d163e9dd3a94d6be66a6919dff41e3af5437e98ae8a50576cb25ecd213c3be00000000000001110000000000000019000000000000138800000000000061a800480019018dc262ab3d8932204cae9f6ad55d02b2eb8f0c1a30240cffce0bfaf4eaee83c78126a5b6689b0819654de9575cec805526a2ecf56c0564a119ba6228d392a683b301298ff303409a281e9391899913e433d647d3641e29bf4d2261e2dedee58ff19b81a313bcd6a5569ca8a30a3a8d38842f978870e3d2c9f2701877dadc390e72ad8581f80350c6ab29e276fa9c8ff91d30f81ffc1e91bf44077308c3fd4f9bcd0147050001b337b78001b130b900800000000000000000028000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b71b01922a9715e7ecc3ce2bdd1365f5bb21031ea449de9266835e03cf9cc53b28242c000007dc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e8480ccd0f55bf0c57aeed91f83171d3f1c40112e290addc467672054b23a1abe524a000003e8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d09009f4fb68f3e1dac82202f9aa581ce0bbf1f765df0e9ac3c8c57e20f685abab8ed000001f8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f42403966b742116203fdb684c348788985bef6bf617bfaf0e985ecea90f80a9b1bc9800000fa8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007a1201d61deed074e4ed7ee11573983b363768007418c5925ac537e9fe25595bbb2928000007d800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017700000000000030d4000000000002ab9800092fbd9f938bee777bacd1865cf35318aaecd4142c6b75dca656e082d61292212240000000000ae025a6000000000008800817a7b675021fe0a85125af89ae10ba5a3e6b8b9978cc7f64fee5f87d7195de4d0011d48840c6e131559ec4991026574fb56aae815975c7860d1812067fe705fd7a757741e3c840ebf48a79768b3055b47ee4a708afda1e1e46b6b495d18538707977b35969c68dd4ab80028080000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b8d80c9154b8af3f661e715ee89b2fadd90818f5224ef493341af01e7ce629d941216000003ee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f424066687aadf862bd776c8fc18b8e9f8e20089714856ee233b3902a591d0d5f2925000001f4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e84804fa7db479f0ed6411017cd52c0e705df8fbb2ef874d61e462bf107b42d5d5c76800000fc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007a1201cb35ba108b101fedb4261a43c44c2df7b5fb0bdfd7874c2f675487c054d8de4c000007d4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d0900eb0ef7683a7276bf708ab9cc1d9b1bb4003a0c62c92d629bf4ff12acaddd9494000003ec0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb800000000000186a00000000000155cc00606060606060606060606060606060606060606060606060606060606060606068c4ef35a955a72a28c28ea34e210be5e21c38f4b27c9c061df6b70e439cab61600000000000000000000000000000000000000000000000000000000000400000000000000540002000000000000753000048484848484848484848484848484848484848484848484848484848484848484000000000000005600000000014fb1800000000001312d0102ffbfb9dfb84acd2c2e3100054402a6c713d9b5d9d0865c7723fc56c3ea26f9490024bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b820b584a48848900000000002b80969800000000002200205e9ed9d4087f82a14496be26b842e968f9ae2e65e331fd93fb97e1f5c657793400475221031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f2103afd229e5da2cc156d1fb929c22bf6878791adad2574614e1c1e5decd65a71a3752ae00000000000000000000000000000000000000000000000000000000000000000000000000000000001562095db1aa5fca1c46275348acc0f071419b58ebfb86f5fcb03882bcf441b528869a358d38c9e68ae24a37d198d6a022de4c8a70264cff735f47c6314f3e9e6482095db1aa5fca1c46275348acc0f071419b58ebfb86f5fcb03882bcf441b528869a358d38c9e68ae24a37d198d6a022de4c8a70264cff735f47c6314f3e9e6482095db1aa5fca1c46275348acc0f071419b58ebfb86f5fcb03882bcf441b528869a358d38c9e68ae24a37d198d6a022de4c8a70264cff735f47c6314f3e9e6482095db1aa5fca1c46275348acc0f071419b58ebfb86f5fcb03882bcf441b528869a358d38c9e68ae24a37d198d6a022de4c8a70264cff735f47c6314f3e9e6480000dfc518156de366e5834d448d5cc7ee9f263d06cbc2b41138d1ac320000000000000002000004000606a2e9ffc3c021237b3133e0084ad9fe3f03a39c8f97fb77a7fdab79d1979e7d3007fbb20f299bd8046d496629a8467f571378e55960302b1f42b71e2a5bdf44c34c079b41e9a6ddb5d42e218fb2a8cedbf2a730a0ecaea800f1a8319a94cc59be940a0434a3aeeaf6b2c02b9496df043026c7aca1865942915d15fba51c40ae196a6911294617c9ae1b6c5c076a183fa7fc371b3c5fc458fc99b2f5867cd5c4786c3a005cc1872cdd819fdb48b146b83ecd890797bfe09098635fa6b86aeeeb5ad395b8222222222222222222222222222222222222222222222222222222222222222200000000000459b2ba247fea00020054000000000000001e0000047e0000006bf331a269b4c7ed856111126f052529808bdecea1d402b5b0c701b52c97053888002a59ee5bd534c22b1e254c152940280b275fdc3fbeec89517e4b5b67b36b1865ede835ebd0dd00ab0c98ad8686c02716f8bb267949f42bf42752a63418f161308bc333dd3d5e9f2da7824500155cea941f3e0286759e6ae0b82c3f723c3b72849b4d5ddd9b9226f5f08344b64f49940b575b6b29bef53600", - hex"00000303af0ed6052cf28d670665549bc86f4b721c9fdb309d40c58f5811f63966e005d000010000002a000000000000022200000000000000320000000000002710000000000000c3500090003280000001b337b78001b130b90193d163e9dd3a94d6be66a6919dff41e3af5437e98ae8a50576cb25ecd213c3be00000000000001110000000000000019000000000000138800000000000061a800480019018dc262ab3d8932204cae9f6ad55d02b2eb8f0c1a30240cffce0bfaf4eaee83c78126a5b6689b0819654de9575cec805526a2ecf56c0564a119ba6228d392a683b301298ff303409a281e9391899913e433d647d3641e29bf4d2261e2dedee58ff19b81a313bcd6a5569ca8a30a3a8d38842f978870e3d2c9f2701877dadc390e72ad8581f80350c6ab29e276fa9c8ff91d30f81ffc1e91bf44077308c3fd4f9bcd0147050001b337b78001b130b900800000000000000000028000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b71b01922a9715e7ecc3ce2bdd1365f5bb21031ea449de9266835e03cf9cc53b28242c000007dc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e8480ccd0f55bf0c57aeed91f83171d3f1c40112e290addc467672054b23a1abe524a000003e8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d09009f4fb68f3e1dac82202f9aa581ce0bbf1f765df0e9ac3c8c57e20f685abab8ed000001f8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f42403966b742116203fdb684c348788985bef6bf617bfaf0e985ecea90f80a9b1bc9800000fa8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007a1201d61deed074e4ed7ee11573983b363768007418c5925ac537e9fe25595bbb2928000007d800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017700000000000030d4000000000002ab9800092fbd9f938bee777bacd1865cf35318aaecd4142c6b75dca656e082d61292212240000000000ae025a6000000000008800817a7b675021fe0a85125af89ae10ba5a3e6b8b9978cc7f64fee5f87d7195de4d0011d48840c6e131559ec4991026574fb56aae815975c7860d1812067fe705fd7a757741e3c840ebf48a79768b3055b47ee4a708afda1e1e46b6b495d18538707977b35969c68dd4ab80028080000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b8d80c9154b8af3f661e715ee89b2fadd90818f5224ef493341af01e7ce629d941216000003ee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f424066687aadf862bd776c8fc18b8e9f8e20089714856ee233b3902a591d0d5f2925000001f4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e84804fa7db479f0ed6411017cd52c0e705df8fbb2ef874d61e462bf107b42d5d5c76800000fc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007a1201cb35ba108b101fedb4261a43c44c2df7b5fb0bdfd7874c2f675487c054d8de4c000007d4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d0900eb0ef7683a7276bf708ab9cc1d9b1bb4003a0c62c92d629bf4ff12acaddd9494000003ec0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb800000000000186a00000000000155cc00606060606060606060606060606060606060606060606060606060606060606068c4ef35a955a72a28c28ea34e210be5e21c38f4b27c9c061df6b70e439cab61600000000000000000000000000000000000000000000000000000000000400000000000000540002000000000000753000048484848484848484848484848484848484848484848484848484848484848484000000000000005600000000014fb1800000000001312d0102ffbfb9dfb84acd2c2e3100054402a6c713d9b5d9d0865c7723fc56c3ea26f9490024bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b820b584a48848900000000002b80969800000000002200205e9ed9d4087f82a14496be26b842e968f9ae2e65e331fd93fb97e1f5c657793400475221031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f2103afd229e5da2cc156d1fb929c22bf6878791adad2574614e1c1e5decd65a71a3752ae0000000000000000000000000000000000000000000000000000000000000000000000000000000000155294617c9ae1b6c5c076a183fa7fc371b3c5fc458fc99b2f5867cd5c4786c3a005cc1872cdd819fdb48b146b83ecd890797bfe09098635fa6b86aeeeb5ad395b8222222222222222222222222222222222222222222222222222222222222222200000000000459b2ba247fea00020054000000000000001e0000047e0000006b5e9de91a6478fe57a3e851222e8c7a3c88a2fed283901f4871ec9d9c269d1f88002a30ca18940020b43675f3383dff31c0838ad31f6ca9958b8df45da80da9962663773e71207a657d668bf2879b5c654b6bd869eed39f4186492199944bff7e5a93577b05cbfe634321514d80153c20910775551fbe8eb51bf91d2b1063b6e17b2d7a3b030483fcf1b5654e2afcfb381873739cba0a05ef00", - hex"00000303af0ed6052cf28d670665549bc86f4b721c9fdb309d40c58f5811f63966e005d000010000002a000000000000022200000000000000320000000000002710000000000000c3500090003280000001b337b78001b130b90193d163e9dd3a94d6be66a6919dff41e3af5437e98ae8a50576cb25ecd213c3be00000000000001110000000000000019000000000000138800000000000061a800480019018dc262ab3d8932204cae9f6ad55d02b2eb8f0c1a30240cffce0bfaf4eaee83c78126a5b6689b0819654de9575cec805526a2ecf56c0564a119ba6228d392a683b301298ff303409a281e9391899913e433d647d3641e29bf4d2261e2dedee58ff19b81a313bcd6a5569ca8a30a3a8d38842f978870e3d2c9f2701877dadc390e72ad8581f80350c6ab29e276fa9c8ff91d30f81ffc1e91bf44077308c3fd4f9bcd0147050001b337b78001b130b900800000000000000000028000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b71b01922a9715e7ecc3ce2bdd1365f5bb21031ea449de9266835e03cf9cc53b28242c000007dc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e8480ccd0f55bf0c57aeed91f83171d3f1c40112e290addc467672054b23a1abe524a000003e8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d09009f4fb68f3e1dac82202f9aa581ce0bbf1f765df0e9ac3c8c57e20f685abab8ed000001f8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f42403966b742116203fdb684c348788985bef6bf617bfaf0e985ecea90f80a9b1bc9800000fa8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007a1201d61deed074e4ed7ee11573983b363768007418c5925ac537e9fe25595bbb2928000007d800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017700000000000030d4000000000002ab9800092fbd9f938bee777bacd1865cf35318aaecd4142c6b75dca656e082d61292212240000000000ae025a6000000000008800817a7b675021fe0a85125af89ae10ba5a3e6b8b9978cc7f64fee5f87d7195de4d0011d48840c6e131559ec4991026574fb56aae815975c7860d1812067fe705fd7a757741e3c840ebf48a79768b3055b47ee4a708afda1e1e46b6b495d18538707977b35969c68dd4ab80028080000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b8d80c9154b8af3f661e715ee89b2fadd90818f5224ef493341af01e7ce629d941216000003ee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f424066687aadf862bd776c8fc18b8e9f8e20089714856ee233b3902a591d0d5f2925000001f4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e84804fa7db479f0ed6411017cd52c0e705df8fbb2ef874d61e462bf107b42d5d5c76800000fc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007a1201cb35ba108b101fedb4261a43c44c2df7b5fb0bdfd7874c2f675487c054d8de4c000007d4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d0900eb0ef7683a7276bf708ab9cc1d9b1bb4003a0c62c92d629bf4ff12acaddd9494000003ec0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb800000000000186a00000000000155cc00606060606060606060606060606060606060606060606060606060606060606068c4ef35a955a72a28c28ea34e210be5e21c38f4b27c9c061df6b70e439cab61600000000000000000000000000000000000000000000000000000000000400000000000000540002000000000000753000048484848484848484848484848484848484848484848484848484848484848484000000000000005600000000014fb1800000000001312d0102ffbfb9dfb84acd2c2e3100054402a6c713d9b5d9d0865c7723fc56c3ea26f9490024bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b820b584a48848900000000002b80969800000000002200205e9ed9d4087f82a14496be26b842e968f9ae2e65e331fd93fb97e1f5c657793400475221031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f2103afd229e5da2cc156d1fb929c22bf6878791adad2574614e1c1e5decd65a71a3752ae0000000000000000000000000000000000000000000000000000000000000000000000000000000000155294617c9ae1b6c5c076a183fa7fc371b3c5fc458fc99b2f5867cd5c4786c3a005cc1872cdd819fdb48b146b83ecd890797bfe09098635fa6b86aeeeb5ad395b8222222222222222222222222222222222222222222222222222222222222222200000000000459b2ba247fea00020054000000000000001e0000047e0000006b6d8da39cd140e7426fa82af4eda7343a56702c8a515abd602c6ec71443ad95c2002ac447de9ce87da33ddc3d9bf55956749bf69c13395a51ec5b1971142f430b92e3b2723ef2dd2ab520709500", - hex"00000303af0ed6052cf28d670665549bc86f4b721c9fdb309d40c58f5811f63966e005d000010000002a00000000000002220000000002faf0800000000000002710000000000000271000900032800000016f5680015f7781a82cdc4f8f7f30aad446a7887d4cc0d3e1084dc9bdb5e8e5b0c8ca70f5bb462e000000000000011100000000002625a0000000000000138800000000000009c400480019018dc262ab3d8932204cae9f6ad55d02b2eb8f0c1a30240cffce0bfaf4eaee83c78126a5b6689b0819654de9575cec805526a2ecf56c0564a119ba6228d392a683b301298ff303409a281e9391899913e433d647d3641e29bf4d2261e2dedee58ff19b81a313bcd6a5569ca8a30a3a8d38842f978870e3d2c9f2701877dadc390e72ad8581f80350c6ab29e276fa9c8ff91d30f81ffc1e91bf44077308c3fd4f9bcd01470500016f5680015f778080000000000000000002c000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000f424027d3eda3cf876b20880be6a9607382efc7dd977c3a6b0f2315f883da16aeae3b4000007e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e00000000005b8d80c9154b8af3f661e715ee89b2fadd90818f5224ef493341af01e7ce629d941216000003ee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000001e848072cd6e8422c407fb6d098690f1130b7ded7ec2f7f5e1d30bd9d521f015363793000001f5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f00000000000f42403ac3bdda0e9c9dafdc22ae730766c6ed000e8318b24b58a6fd3fc4ab2b776525000000fb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d090199a1eab7e18af5ddb23f062e3a7e3880225c5215bb88cece40a96474357ca494000007d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001770000000000bebc2000000000010b076000092fbd9f938bee777bacd1865cf35318aaecd4142c6b75dca656e082d61292212240000000000ae025a6000000000008800817a7b675021fe0a85125af89ae10ba5a3e6b8b9978cc7f64fee5f87d7195de4d0011d48840c6e131559ec4991026574fb56aae815975c7860d1812067fe705fd7a757741e3c840ebf48a79768b3055b47ee4a708afda1e1e46b6b495d18538707977b35969c68dd4ab80028080000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000000000000000003e00000000005b8d80c9154b8af3f661e715ee89b2fadd90818f5224ef493341af01e7ce629d941216000003ee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000001e848072cd6e8422c407fb6d098690f1130b7ded7ec2f7f5e1d30bd9d521f015363793000001f5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000f00000000000f42403ac3bdda0e9c9dafdc22ae730766c6ed000e8318b24b58a6fd3fc4ab2b776525000000fb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000f424027d3eda3cf876b20880be6a9607382efc7dd977c3a6b0f2315f883da16aeae3b4000007e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e8480ccd0f55bf0c57aeed91f83171d3f1c40112e290addc467672054b23a1abe524a000003e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb800000000000186a00000000000155cc00606060606060606060606060606060606060606060606060606060606060606068c4ef35a955a72a28c28ea34e210be5e21c38f4b27c9c061df6b70e439cab616000000000000000000000000000000000000004000000000000000080004000000000000005400071170d49a0d7890596541859abfcacc78000000000000753000045454545454545454545454545454545454545454545454545454545454545454000000000000005600000000014fb1800000000001312d010232127dae95d9b2ebdb58e84cb369ac52f5f8378a57337bdb0883faa1dce1e40c0024bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b820b584a48848900000000002b80969800000000002200205e9ed9d4087f82a14496be26b842e968f9ae2e65e331fd93fb97e1f5c657793400475221031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f2103afd229e5da2cc156d1fb929c22bf6878791adad2574614e1c1e5decd65a71a3752ae0000000000000000000000000000000000000000000000000000000000000000000000000000000000154a91daf3412b0a03126494bcf38606251bcd2dc2fdeb61f29be3dc28faaefcfe0ec15070b07373460a1340146387ca1fb0ee5d0b2399f797bc8fa9b0d805fc358020202020202020202020202020202020202020202020202020202020202020200000000000459b2ba24846802000054000000000000001e0000047e0000006a00000007d000000000", - hex"00000303af0ed6052cf28d670665549bc86f4b721c9fdb309d40c58f5811f63966e005d000010000002a00000000000002220000000002faf0800000000000002710000000000000271000900032800000016f5680015f7781a82cdc4f8f7f30aad446a7887d4cc0d3e1084dc9bdb5e8e5b0c8ca70f5bb462e000000000000011100000000002625a0000000000000138800000000000009c400480019018dc262ab3d8932204cae9f6ad55d02b2eb8f0c1a30240cffce0bfaf4eaee83c78126a5b6689b0819654de9575cec805526a2ecf56c0564a119ba6228d392a683b301298ff303409a281e9391899913e433d647d3641e29bf4d2261e2dedee58ff19b81a313bcd6a5569ca8a30a3a8d38842f978870e3d2c9f2701877dadc390e72ad8581f80350c6ab29e276fa9c8ff91d30f81ffc1e91bf44077308c3fd4f9bcd01470500016f5680015f778080000000000000000002c000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000f424027d3eda3cf876b20880be6a9607382efc7dd977c3a6b0f2315f883da16aeae3b4000007e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e00000000005b8d80c9154b8af3f661e715ee89b2fadd90818f5224ef493341af01e7ce629d941216000003ee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000001e848072cd6e8422c407fb6d098690f1130b7ded7ec2f7f5e1d30bd9d521f015363793000001f5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f00000000000f42403ac3bdda0e9c9dafdc22ae730766c6ed000e8318b24b58a6fd3fc4ab2b776525000000fb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d090199a1eab7e18af5ddb23f062e3a7e3880225c5215bb88cece40a96474357ca494000007d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001770000000000bebc2000000000010b076000092fbd9f938bee777bacd1865cf35318aaecd4142c6b75dca656e082d61292212240000000000ae025a6000000000008800817a7b675021fe0a85125af89ae10ba5a3e6b8b9978cc7f64fee5f87d7195de4d0011d48840c6e131559ec4991026574fb56aae815975c7860d1812067fe705fd7a757741e3c840ebf48a79768b3055b47ee4a708afda1e1e46b6b495d18538707977b35969c68dd4ab80028080000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000000000000000003e00000000005b8d80c9154b8af3f661e715ee89b2fadd90818f5224ef493341af01e7ce629d941216000003ee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000001e848072cd6e8422c407fb6d098690f1130b7ded7ec2f7f5e1d30bd9d521f015363793000001f5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000f00000000000f42403ac3bdda0e9c9dafdc22ae730766c6ed000e8318b24b58a6fd3fc4ab2b776525000000fb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000f424027d3eda3cf876b20880be6a9607382efc7dd977c3a6b0f2315f883da16aeae3b4000007e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e8480ccd0f55bf0c57aeed91f83171d3f1c40112e290addc467672054b23a1abe524a000003e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb800000000000186a00000000000155cc00606060606060606060606060606060606060606060606060606060606060606068c4ef35a955a72a28c28ea34e210be5e21c38f4b27c9c061df6b70e439cab616000000000000000000000000000000000000004000000000000000080004000000000000005400071170d49a0d7890596541859abfcacc78000000000000753000045454545454545454545454545454545454545454545454545454545454545454000000000000005600000000014fb1800000000001312d010232127dae95d9b2ebdb58e84cb369ac52f5f8378a57337bdb0883faa1dce1e40c0024bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b820b584a48848900000000002b80969800000000002200205e9ed9d4087f82a14496be26b842e968f9ae2e65e331fd93fb97e1f5c657793400475221031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f2103afd229e5da2cc156d1fb929c22bf6878791adad2574614e1c1e5decd65a71a3752ae0000000000000000000000000000000000000000000000000000000000000000000000000000000000156f3e533754ca7b7780f42694dbe0cc8153864708e6bb0073c9b486a4d026a45d9142a46849870bfe07e92ac8a04968ecfef9d1eb137535603e893cefa1cbf7b64c59c33c4fbb17251ef48b7a3f62ad7ec06d47cf4e3856f2d2b3dde963340f5a0758cc599a4ecb882b77cf47700b00b9916910596dd20794db75e4eef2e6c9c60febcca5b484c9ec1608834c7c22b874f601b2f315066a3aea7ffa256eb94ba9a8d0b58c0e3ea3c74a2f6dcce6d0dd54a60375531f2efa98961332a8d442bf55b3ee244c21af045c81be8d380516436f1b3e1dd9797a2fe17932080f4e184c6338eae5c5058e9414ad0e523ab7a065a0948979f52e4c2839bc394ad706b429ad80000dfc518156de366e5834d448d5cc7ee9f263d06cbc2b41138d1ac320000000000000002000004000604507392d46705e690307786517fea3b9d30d23fa4abd3653f77134d1d0e3392a804f7b82122f515d8ccd2fff9598cba8836fbb7f46a2a8e31b5745c77d03c6b715a0492244be04f6aedcb750a6c70028807e725f44a305bd30b6535fbe62de8fe2382056b3de2cdc59ad67ad3b9689698b92f07809c6d50a241ca50bc586137e0708bbca91daf3412b0a03126494bcf38606251bcd2dc2fdeb61f29be3dc28faaefcfe0ec15070b07373460a1340146387ca1fb0ee5d0b2399f797bc8fa9b0d805fc358020202020202020202020202020202020202020202020202020202020202020200000000000459b2ba24846802000054000000000000001e0000047e0000006a00000007d000000000", - hex"00000303af0ed6052cf28d670665549bc86f4b721c9fdb309d40c58f5811f63966e005d000010000002a00000000000002220000000002faf0800000000000002710000000000000271000900032800000016f5680015f7781a82cdc4f8f7f30aad446a7887d4cc0d3e1084dc9bdb5e8e5b0c8ca70f5bb462e000000000000011100000000002625a0000000000000138800000000000009c400480019018dc262ab3d8932204cae9f6ad55d02b2eb8f0c1a30240cffce0bfaf4eaee83c78126a5b6689b0819654de9575cec805526a2ecf56c0564a119ba6228d392a683b301298ff303409a281e9391899913e433d647d3641e29bf4d2261e2dedee58ff19b81a313bcd6a5569ca8a30a3a8d38842f978870e3d2c9f2701877dadc390e72ad8581f80350c6ab29e276fa9c8ff91d30f81ffc1e91bf44077308c3fd4f9bcd01470500016f5680015f778080000000000000000002c000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000f424027d3eda3cf876b20880be6a9607382efc7dd977c3a6b0f2315f883da16aeae3b4000007e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e00000000005b8d80c9154b8af3f661e715ee89b2fadd90818f5224ef493341af01e7ce629d941216000003ee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000001e848072cd6e8422c407fb6d098690f1130b7ded7ec2f7f5e1d30bd9d521f015363793000001f5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f00000000000f42403ac3bdda0e9c9dafdc22ae730766c6ed000e8318b24b58a6fd3fc4ab2b776525000000fb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d090199a1eab7e18af5ddb23f062e3a7e3880225c5215bb88cece40a96474357ca494000007d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001770000000000bebc2000000000010b076000092fbd9f938bee777bacd1865cf35318aaecd4142c6b75dca656e082d61292212240000000000ae025a6000000000008800817a7b675021fe0a85125af89ae10ba5a3e6b8b9978cc7f64fee5f87d7195de4d0011d48840c6e131559ec4991026574fb56aae815975c7860d1812067fe705fd7a757741e3c840ebf48a79768b3055b47ee4a708afda1e1e46b6b495d18538707977b35969c68dd4ab80028080000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000000000000000003e00000000005b8d80c9154b8af3f661e715ee89b2fadd90818f5224ef493341af01e7ce629d941216000003ee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000001e848072cd6e8422c407fb6d098690f1130b7ded7ec2f7f5e1d30bd9d521f015363793000001f5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000f00000000000f42403ac3bdda0e9c9dafdc22ae730766c6ed000e8318b24b58a6fd3fc4ab2b776525000000fb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000f424027d3eda3cf876b20880be6a9607382efc7dd977c3a6b0f2315f883da16aeae3b4000007e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e8480ccd0f55bf0c57aeed91f83171d3f1c40112e290addc467672054b23a1abe524a000003e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb800000000000186a00000000000155cc00606060606060606060606060606060606060606060606060606060606060606068c4ef35a955a72a28c28ea34e210be5e21c38f4b27c9c061df6b70e439cab616000000000000000000000000000000000000004000000000000000080004000000000000005400071170d49a0d7890596541859abfcacc78000000000000753000045454545454545454545454545454545454545454545454545454545454545454000000000000005600000000014fb1800000000001312d010232127dae95d9b2ebdb58e84cb369ac52f5f8378a57337bdb0883faa1dce1e40c0024bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b820b584a48848900000000002b80969800000000002200205e9ed9d4087f82a14496be26b842e968f9ae2e65e331fd93fb97e1f5c657793400475221031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f2103afd229e5da2cc156d1fb929c22bf6878791adad2574614e1c1e5decd65a71a3752ae0000000000000000000000000000000000000000000000000000000000000000000000000000000000156f3e533754ca7b7780f42694dbe0cc8153864708e6bb0073c9b486a4d026a45d9142a46849870bfe07e92ac8a04968ecfef9d1eb137535603e893cefa1cbf7b64c59c33c4fbb17251ef48b7a3f62ad7ec06d47cf4e3856f2d2b3dde963340f5a0758cc599a4ecb882b77cf47700b00b9916910596dd20794db75e4eef2e6c9c60febcca5b484c9ec1608834c7c22b874f601b2f315066a3aea7ffa256eb94ba9a8d0b58c0e3ea3c74a2f6dcce6d0dd54a60375531f2efa98961332a8d442bf55b3ee244c21af045c81be8d380516436f1b3e1dd9797a2fe17932080f4e184c6338eae5c5058e9414ad0e523ab7a065a0948979f52e4c2839bc394ad706b429ad80000dfc518156de366e5834d448d5cc7ee9f263d06cbc2b41138d1ac320000000000000002000004000604507392d46705e690307786517fea3b9d30d23fa4abd3653f77134d1d0e3392a804f7b82122f515d8ccd2fff9598cba8836fbb7f46a2a8e31b5745c77d03c6b715a0492244be04f6aedcb750a6c70028807e725f44a305bd30b6535fbe62de8fe2382056b3de2cdc59ad67ad3b9689698b92f07809c6d50a241ca50bc586137e0708bbca91daf3412b0a03126494bcf38606251bcd2dc2fdeb61f29be3dc28faaefcfe0ec15070b07373460a1340146387ca1fb0ee5d0b2399f797bc8fa9b0d805fc358020202020202020202020202020202020202020202020202020202020202020200000000000459b2ba24846802000054000000000000001e0000047e0000006a00000007d0000001aa17af5812b244fdd14b29dfb4238f93d2841f471816fda220fc31213664cc23002abf4517129784b9f3d4f86591a38715dfda74f0c59abbd2b2999386494d55960717ac8e9d56635ad0b99700", - hex"00000303af0ed6052cf28d670665549bc86f4b721c9fdb309d40c58f5811f63966e005d000010000002a00000000000002220000000002faf0800000000000002710000000000000271000900032800000016f5680015f7781a82cdc4f8f7f30aad446a7887d4cc0d3e1084dc9bdb5e8e5b0c8ca70f5bb462e000000000000011100000000002625a0000000000000138800000000000009c400480019018dc262ab3d8932204cae9f6ad55d02b2eb8f0c1a30240cffce0bfaf4eaee83c78126a5b6689b0819654de9575cec805526a2ecf56c0564a119ba6228d392a683b301298ff303409a281e9391899913e433d647d3641e29bf4d2261e2dedee58ff19b81a313bcd6a5569ca8a30a3a8d38842f978870e3d2c9f2701877dadc390e72ad8581f80350c6ab29e276fa9c8ff91d30f81ffc1e91bf44077308c3fd4f9bcd01470500016f5680015f778080000000000000000002c000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000f424027d3eda3cf876b20880be6a9607382efc7dd977c3a6b0f2315f883da16aeae3b4000007e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e00000000005b8d80c9154b8af3f661e715ee89b2fadd90818f5224ef493341af01e7ce629d941216000003ee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000001e848072cd6e8422c407fb6d098690f1130b7ded7ec2f7f5e1d30bd9d521f015363793000001f5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f00000000000f42403ac3bdda0e9c9dafdc22ae730766c6ed000e8318b24b58a6fd3fc4ab2b776525000000fb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d090199a1eab7e18af5ddb23f062e3a7e3880225c5215bb88cece40a96474357ca494000007d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001770000000000bebc2000000000010b076000092fbd9f938bee777bacd1865cf35318aaecd4142c6b75dca656e082d61292212240000000000ae025a6000000000008800817a7b675021fe0a85125af89ae10ba5a3e6b8b9978cc7f64fee5f87d7195de4d0011d48840c6e131559ec4991026574fb56aae815975c7860d1812067fe705fd7a757741e3c840ebf48a79768b3055b47ee4a708afda1e1e46b6b495d18538707977b35969c68dd4ab80028080000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000000000000000003e00000000005b8d80c9154b8af3f661e715ee89b2fadd90818f5224ef493341af01e7ce629d941216000003ee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000001e848072cd6e8422c407fb6d098690f1130b7ded7ec2f7f5e1d30bd9d521f015363793000001f5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000f00000000000f42403ac3bdda0e9c9dafdc22ae730766c6ed000e8318b24b58a6fd3fc4ab2b776525000000fb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000f424027d3eda3cf876b20880be6a9607382efc7dd977c3a6b0f2315f883da16aeae3b4000007e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e8480ccd0f55bf0c57aeed91f83171d3f1c40112e290addc467672054b23a1abe524a000003e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb800000000000186a00000000000155cc00606060606060606060606060606060606060606060606060606060606060606068c4ef35a955a72a28c28ea34e210be5e21c38f4b27c9c061df6b70e439cab616000000000000000000000000000000000000004000000000000000080004000000000000005400071170d49a0d7890596541859abfcacc78000000000000753000045454545454545454545454545454545454545454545454545454545454545454000000000000005600000000014fb1800000000001312d010232127dae95d9b2ebdb58e84cb369ac52f5f8378a57337bdb0883faa1dce1e40c0024bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b820b584a48848900000000002b80969800000000002200205e9ed9d4087f82a14496be26b842e968f9ae2e65e331fd93fb97e1f5c657793400475221031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f2103afd229e5da2cc156d1fb929c22bf6878791adad2574614e1c1e5decd65a71a3752ae0000000000000000000000000000000000000000000000000000000000000000000000000000000000156f3e533754ca7b7780f42694dbe0cc8153864708e6bb0073c9b486a4d026a45d9142a46849870bfe07e92ac8a04968ecfef9d1eb137535603e893cefa1cbf7b64c59c33c4fbb17251ef48b7a3f62ad7ec06d47cf4e3856f2d2b3dde963340f5a0758cc599a4ecb882b77cf47700b00b9916910596dd20794db75e4eef2e6c9c60febcca5b484c9ec1608834c7c22b874f601b2f315066a3aea7ffa256eb94ba9a8d0b58c0e3ea3c74a2f6dcce6d0dd54a60375531f2efa98961332a8d442bf55b3ee244c21af045c81be8d380516436f1b3e1dd9797a2fe17932080f4e184c6338eae5c5058e9414ad0e523ab7a065a0948979f52e4c2839bc394ad706b429ad80000dfc518156de366e5834d448d5cc7ee9f263d06cbc2b41138d1ac320000000000000002000004000604507392d46705e690307786517fea3b9d30d23fa4abd3653f77134d1d0e3392a804f7b82122f515d8ccd2fff9598cba8836fbb7f46a2a8e31b5745c77d03c6b715a0492244be04f6aedcb750a6c70028807e725f44a305bd30b6535fbe62de8fe2382056b3de2cdc59ad67ad3b9689698b92f07809c6d50a241ca50bc586137e0708bbca91daf3412b0a03126494bcf38606251bcd2dc2fdeb61f29be3dc28faaefcfe0ec15070b07373460a1340146387ca1fb0ee5d0b2399f797bc8fa9b0d805fc358020202020202020202020202020202020202020202020202020202020202020200000000000459b2ba24846802000054000000000000001e0000047e0000006a00000007d000000141457ceb9407293dd4481318fd2da9c6f63c5dfb59fdc91b1793084b5b5effb3002aa5b677089a1263d5025f3fd1e57fa057ab13609b78e335d581ff56109aa40a3069373c1cab1f89066e139c3126090eea2396fb806c8f4ff3a52bff536b63c455805a678ac5b1a432d7d200157039a400d6f98feb6bcbdafa0345d58c2c1217a2d2c6a297ef2cd39532aaa1b3fcee6719042ff4a09d6f80", - hex"00000303af0ed6052cf28d670665549bc86f4b721c9fdb309d40c58f5811f63966e005d000010000002a00000000000002220000000002faf0800000000000002710000000000000271000900032800000016f5680015f7781a82cdc4f8f7f30aad446a7887d4cc0d3e1084dc9bdb5e8e5b0c8ca70f5bb462e000000000000011100000000002625a0000000000000138800000000000009c400480019018dc262ab3d8932204cae9f6ad55d02b2eb8f0c1a30240cffce0bfaf4eaee83c78126a5b6689b0819654de9575cec805526a2ecf56c0564a119ba6228d392a683b301298ff303409a281e9391899913e433d647d3641e29bf4d2261e2dedee58ff19b81a313bcd6a5569ca8a30a3a8d38842f978870e3d2c9f2701877dadc390e72ad8581f80350c6ab29e276fa9c8ff91d30f81ffc1e91bf44077308c3fd4f9bcd01470500016f5680015f778080000000000000000002c000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000f424027d3eda3cf876b20880be6a9607382efc7dd977c3a6b0f2315f883da16aeae3b4000007e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e00000000005b8d80c9154b8af3f661e715ee89b2fadd90818f5224ef493341af01e7ce629d941216000003ee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000001e848072cd6e8422c407fb6d098690f1130b7ded7ec2f7f5e1d30bd9d521f015363793000001f5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f00000000000f42403ac3bdda0e9c9dafdc22ae730766c6ed000e8318b24b58a6fd3fc4ab2b776525000000fb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d090199a1eab7e18af5ddb23f062e3a7e3880225c5215bb88cece40a96474357ca494000007d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001770000000000bebc2000000000010b076000092fbd9f938bee777bacd1865cf35318aaecd4142c6b75dca656e082d61292212240000000000ae025a6000000000008800817a7b675021fe0a85125af89ae10ba5a3e6b8b9978cc7f64fee5f87d7195de4d0011d48840c6e131559ec4991026574fb56aae815975c7860d1812067fe705fd7a757741e3c840ebf48a79768b3055b47ee4a708afda1e1e46b6b495d18538707977b35969c68dd4ab80028080000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000000000000000003e00000000005b8d80c9154b8af3f661e715ee89b2fadd90818f5224ef493341af01e7ce629d941216000003ee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000001e848072cd6e8422c407fb6d098690f1130b7ded7ec2f7f5e1d30bd9d521f015363793000001f5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000f00000000000f42403ac3bdda0e9c9dafdc22ae730766c6ed000e8318b24b58a6fd3fc4ab2b776525000000fb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000f424027d3eda3cf876b20880be6a9607382efc7dd977c3a6b0f2315f883da16aeae3b4000007e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e8480ccd0f55bf0c57aeed91f83171d3f1c40112e290addc467672054b23a1abe524a000003e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb800000000000186a00000000000155cc00606060606060606060606060606060606060606060606060606060606060606068c4ef35a955a72a28c28ea34e210be5e21c38f4b27c9c061df6b70e439cab616000000000000000000000000000000000000004000000000000000080004000000000000005400071170d49a0d7890596541859abfcacc78000000000000753000045454545454545454545454545454545454545454545454545454545454545454000000000000005600000000014fb1800000000001312d010232127dae95d9b2ebdb58e84cb369ac52f5f8378a57337bdb0883faa1dce1e40c0024bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b820b584a48848900000000002b80969800000000002200205e9ed9d4087f82a14496be26b842e968f9ae2e65e331fd93fb97e1f5c657793400475221031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f2103afd229e5da2cc156d1fb929c22bf6878791adad2574614e1c1e5decd65a71a3752ae0000000000000000000000000000000000000000000000000000000000000000000000000000000000154a91daf3412b0a03126494bcf38606251bcd2dc2fdeb61f29be3dc28faaefcfe0ec15070b07373460a1340146387ca1fb0ee5d0b2399f797bc8fa9b0d805fc358020202020202020202020202020202020202020202020202020202020202020200000000000459b2ba24846802000054000000000000001e0000047e0000006a00000007d0000001dc1f2ab0cd4b19c58ea0261604ecfb938cc72a0c175808c996d0493bb7b9b279002a87ddd6eba29744cdf4e6cf63ddfff74a99de823dfc99ddd9a4407b47beeee6b0e045c968610b0f58dfb9c41e2f2ccc916abc8ad3e91857024b8554c2e6df2fc1904d859431c83afeed7a001549ddac755c583fe55b54cf24f4400fca26a97fd59a1e6f8686bf4f57d37f3e84ac63bc9dd05dc95a47c680", - hex"00000303af0ed6052cf28d670665549bc86f4b721c9fdb309d40c58f5811f63966e005d000010000002a00000000000002220000000002faf0800000000000002710000000000000271000900032800000016f5680015f7781a82cdc4f8f7f30aad446a7887d4cc0d3e1084dc9bdb5e8e5b0c8ca70f5bb462e000000000000011100000000002625a0000000000000138800000000000009c400480019018dc262ab3d8932204cae9f6ad55d02b2eb8f0c1a30240cffce0bfaf4eaee83c78126a5b6689b0819654de9575cec805526a2ecf56c0564a119ba6228d392a683b301298ff303409a281e9391899913e433d647d3641e29bf4d2261e2dedee58ff19b81a313bcd6a5569ca8a30a3a8d38842f978870e3d2c9f2701877dadc390e72ad8581f80350c6ab29e276fa9c8ff91d30f81ffc1e91bf44077308c3fd4f9bcd01470500016f5680015f778080000000000000000002c000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000f424027d3eda3cf876b20880be6a9607382efc7dd977c3a6b0f2315f883da16aeae3b4000007e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e00000000005b8d80c9154b8af3f661e715ee89b2fadd90818f5224ef493341af01e7ce629d941216000003ee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000001e848072cd6e8422c407fb6d098690f1130b7ded7ec2f7f5e1d30bd9d521f015363793000001f5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f00000000000f42403ac3bdda0e9c9dafdc22ae730766c6ed000e8318b24b58a6fd3fc4ab2b776525000000fb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d090199a1eab7e18af5ddb23f062e3a7e3880225c5215bb88cece40a96474357ca494000007d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001770000000000bebc2000000000010b076000092fbd9f938bee777bacd1865cf35318aaecd4142c6b75dca656e082d61292212240000000000ae025a6000000000008800817a7b675021fe0a85125af89ae10ba5a3e6b8b9978cc7f64fee5f87d7195de4d0011d48840c6e131559ec4991026574fb56aae815975c7860d1812067fe705fd7a757741e3c840ebf48a79768b3055b47ee4a708afda1e1e46b6b495d18538707977b35969c68dd4ab80028080000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000000000000000003e00000000005b8d80c9154b8af3f661e715ee89b2fadd90818f5224ef493341af01e7ce629d941216000003ee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000001e848072cd6e8422c407fb6d098690f1130b7ded7ec2f7f5e1d30bd9d521f015363793000001f5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000f00000000000f42403ac3bdda0e9c9dafdc22ae730766c6ed000e8318b24b58a6fd3fc4ab2b776525000000fb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000f424027d3eda3cf876b20880be6a9607382efc7dd977c3a6b0f2315f883da16aeae3b4000007e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e8480ccd0f55bf0c57aeed91f83171d3f1c40112e290addc467672054b23a1abe524a000003e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb800000000000186a00000000000155cc00606060606060606060606060606060606060606060606060606060606060606068c4ef35a955a72a28c28ea34e210be5e21c38f4b27c9c061df6b70e439cab616000000000000000000000000000000000000004000000000000000080004000000000000005400071170d49a0d7890596541859abfcacc78000000000000753000045454545454545454545454545454545454545454545454545454545454545454000000000000005600000000014fb1800000000001312d010232127dae95d9b2ebdb58e84cb369ac52f5f8378a57337bdb0883faa1dce1e40c0024bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b820b584a48848900000000002b80969800000000002200205e9ed9d4087f82a14496be26b842e968f9ae2e65e331fd93fb97e1f5c657793400475221031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f2103afd229e5da2cc156d1fb929c22bf6878791adad2574614e1c1e5decd65a71a3752ae0000000000000000000000000000000000000000000000000000000000000000000000000000000000154a91daf3412b0a03126494bcf38606251bcd2dc2fdeb61f29be3dc28faaefcfe0ec15070b07373460a1340146387ca1fb0ee5d0b2399f797bc8fa9b0d805fc358020202020202020202020202020202020202020202020202020202020202020200000000000459b2ba24846802000054000000000000001e0000047e0000006a00000007d0000001d35f1ca511bbad8975f358be806cf64b8651b6253ae63c754648e3b4cc70840b002a6730634b8cd9abc89b932f79c1f6d04cda4bb2de8941d2f2f749e1e4cfb7dc451eb93177af8082b9224500", + hex"00000303933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b13400048453785023143c39fa5f8bf7e4f9a0150000000000000222000000174876e800000000000002710000000000000000010090001e000bd48a19f9be2acf1037f3632ffb37e6e5613c9282955ac380000000c5016fee307c64f41705fab7b51a56a1f56118cbb916c39830eca872137ac36d93b800000000000001110000000ba43b7400000000000001388000000000000000008048000f015fe46abd1416829157b1c7379060933d6471d8efa672e5b2eaa81a0291b25de101d1f1f81637ea5a256b71bbbadb81bb210f376f6624a4e5dc3d9294f074e37a7b81181887280c5c7273926681436dde48800fe70470ad1cde534657c343744765c78184f0dc408c8169c3c3a5297dd138f54305424f0fc7f16df16cc7ca01306c022d01aae968489568130ecc2125eeb8198e4593aeff05473d265fc4d8ac4b20d8c9fa00000000c4000000000000000000000000006900000000000000000000000001dcd650000012324c17328eb691b439c21b203707b454e58f66b1a71efad4192349981028504500000000001580127a000000000011001009221c69ce980b6d12405cabc93e8a9af14a63ea54843744a441fc10c57bd5190023a910815cc5e17e7f0dc7456166fe2d1730bdfa08836f74a660c5ad7e3768d84a942f8610815fe46abd1416829157b1c7379060933d6471d8efa672e5b2eaa81a0291b25de12957009701000000000080b24c17328eb691b439c21b203707b454e58f66b1a71efad419234998102850450000000000554b274000fb45f980000000000b000a2268a74aaad781a26adfa36a53c7942a1a5045b1020023982201100529e4bc5d10df63af4a4effef9fa0354ce6798206770e0f6b718e2303258b2481103001f8bbfbcf924829410e64e00f9d1a428d5eba5f8364fdb9d51b54c064b13900a3982201102c14c68a16011ccaa4347482cc8a7b06ba8dd703888cb02fd18d53231e2c6af20110363c444d81383182db2da665fc6ad41dc071b47f8d55feb5fed013d7e38b6c5f80a3a910815cc5e17e7f0dc7456166fe2d1730bdfa08836f74a660c5ad7e3768d84a942f8610815fe46abd1416829157b1c7379060933d6471d8efa672e5b2eaa81a0291b25de1295772268f900000000000000000000000000000690000000001dcd65000000000000000000043b44c9ad3b82c6f7ab351ca83337a387d7b33b162b5a6223eae3e0398e55905813fd45af503be67ec305e284d4f51f05c98dff7bdc06612f6080fb54ead158909800000000000000000000000000000000000000000000000000000000000408ecd0f787a2a7806d62f97f90295fef80190f6355fe4bad69b79f360a3a17c10400919260b99475b48da1ce10d901b83da2a72c7b358d38f7d6a0c91a4cc0814282280000000000ac0093d000000000008800804910e34e74c05b689202e55e49f454d78a531f52a421ba25220fe0862bdea8c8011d48840ae62f0bf3f86e3a2b0b37f168b985efd0441b7ba533062d6bf1bb46c254a17c30840aff2355e8a0b4148abd8e39bc830499eb238ec77d33972d975540d0148d92ef094ab80000c9305cca3ada46d0e7086c80dc1ed153963d9ac69c7beb50648d266040a1411427576e00002600013afa1799ece7b5465112ba86c6672d37fbdaddd446f76aa3337d6b187e3e8640bc11c70cc6086cb01ec5f4d56b6b4c7f8683a77a060817af49d00cfefce0a6d821a4bfebfc134ab8847a5187ece761d75d3ccb904274875680f519848000000009d5db80000980002d5bd28680008048000000000000000080001388000000320", + hex"00000303933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b13400044820ec2b786ab7f784a38b29041fc8980000000000000222000000174876e80000000000000186a000000000000000010090001e000bd48a3ce05b32f90846a133ef7c4e465acfccfd1bf3a04380000000c501c635d0f6880e6cd6553e2953ac2a46978581b45ef3b0a3e6764ca8435f36555200000000000001110000000ba43b7400000000000000c35000000000000000008048000f01c3acb0ccf7c8bdd346cc793c0a8181657fbaac2561a9fe1edfbf8049e57e73540167aac7796687f8853daff6ea1969e56db107b9912864f4d5107ca77fec7c1df2011677e5073fdf1285f514ac3ee89c5b2ecbcae46572d3d70f95e5f6866f59979801d6a7bc1860b39470c81bd67b62a51db06f43b39f4d7568cd6d5643dfbf3f266801714a4d5d4524eeac9684f8c0c6745e126810fe98420a0481de9654f25062541100000000c40000000000000000000000000069000000000000000000000000012a05f2000012238cd59815b8925fd2b37b1863501d6851ac016b7241e5beee7148a944d79360800000000015c04b4c00000000001100103edfca032c9b2b241bf99e178df2898a261a2d7817c0ecb32df7d10aa8825a360023a91081c3acb0ccf7c8bdd346cc793c0a8181657fbaac2561a9fe1edfbf8049e57e73541081df5d8e16513cdb48388769e806305a99ce139ae4092097c25617cca382e413e62957009781000000000080a38cd59815b8925fd2b37b1863501d6851ac016b7241e5beee7148a944d79360800000000076b4944000bb7f4b80000000000b000a00b02eb4d78ea28a9bb870371b6f5ddea3daa7e502002418228110805bb8e6e5fc150c6f250413318fe0ef4da3aa1f99d44a897a0dcb490171271ef181101d6ca8d71e70f60e150511d001d7545031cc12de2f13b76c01e41279465e8bd980a398220110341be8137f0e914b4174da64f26e824f593b16b72d686212d928b1a3b771a81b811035944edf115e67579e9c5ce828dc9f76fed6dc92816bfaa519621b93af27655900a3a91081c3acb0ccf7c8bdd346cc793c0a8181657fbaac2561a9fe1edfbf8049e57e73541081df5d8e16513cdb48388769e806305a99ce139ae4092097c25617cca382e413e629574067e99000000000000000000000000000006900000000012a05f20000000000000000005994c72ab64fc714c2df0a9168213a46de91abb6253584c44d4235d83749d27581b2564bf1d66347e017679a49afeebe4483405b03b97b2398ca1a9bd27d6802bb80000000000000000000000000000000000000000000000000000000000040c12a306373063e01d873216f22efed896e443fcf71a4665748a1750f4a473b7e400911c66acc0adc492fe959bd8c31a80eb428d600b5b920f2df7738a454a26bc9b040000000000ae025a600000000000880081f6fe501964d95920dfccf0bc6f944c5130d16bc0be0765996fbe88554412d1b0011d48840e1d658667be45ee9a3663c9e0540c0b2bfdd5612b0d4ff0f6fdfc024f2bf39aa0840efaec70b289e6da41c43b4f403182d4ce709cd7204904be12b0be651c17209f314ab800008e33566056e2497f4acdec618d4075a146b005adc90796fbb9c522a5135e4d8227597000054c0001257dafb6f3a2d0fa1f9ccaa73f1dc8eba4ccda6dd64b116dbc1980627dd6fdfd2d205cfb617c180ce4d17c63a44123623c91ca386414860cd18e7ab3b0556249a1a4bfebfc134ab8847a5187ece761d75d3ccb904274875680f519848000000009d65c00015300002d5dd56c800080480000000000000000800001f4000000320", + hex"00000303933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b13400042310140aee04fc3a1082c0ba12337e8c0000000000000222000000003b9aca00000000000000753000000000000000010090001e000bd48a324e1921e98b8e82235e4b91f0c43f66a8375d304380000000c5018dc2c1bdf8102ecea6bc5e8c3e6ec50872eda537c75bbf8374b18b89ed0b2d9880000000000001110000000ba43b74000000000000003a9800000000000000008048000f01442a596afe3658e33d508b1250a8a2424a2f05d732f9def71719f13fc6c2ba2001f3d12cedf8af25f136969e80bcdc5cb2a655ca0e5abefa27388e690f1fa7c5b281fcbf05b7508d1a1c4517122cb247306e87025e876da029fd69f9fc937bf5bb8a81a27e97139b5f3633ad83d7fd79d06a068f72043981e8a061a4d3291ebfec86fc018ce3c050049c4a7e13ab3c82cbc5e6a961510026b4f2e645321c500c1690b32480000000c400000000000000000c0000000069000000000000c11aac0000000058a7145400127de4dfd06a3ef178f16460e9d56accf79b916b78ea51eec7d70bd8e41247bd9c000000000015e06316800000000011001026860fb237c202673f6a5ffd8c3fefb6cd22be264c9d17533e5a93723683cf6f8023a91081442a596afe3658e33d508b1250a8a2424a2f05d732f9def71719f13fc6c2ba2010816a362d6f6e23213f27d9437b45a06ad0d970bf15ec8f205808ff0faa6110beeaa95700ac81000000000080fde4dfd06a3ef178f16460e9d56accf79b916b78ea51eec7d70bd8e41247bd9c00000000004924b140016f310000000000001100105ae2362cc327dce623b5db68025ee61308d10282c2f3b3f19665cbadd4e13f456be59600000000000b000a18552aec4e13ac9f0bfcbaf578caa197b036bf5882002418228110804dc0de11f5d3d16a50ed0f0d40689b80c588efb40b91ffa69c07495c84e4736601100687f0bb0b370708d117106defad2c5054f0a430a93326a9608d075e3aec927a80a3182181100eb6c682bcc7811441516094d7fcfd6f7d84b5a82ee6a7545e6069d6e9dc9cfb810fa3140dad08f6d2f375b94c890d615bc8a2cee555bb4477697b29f898ea0bb900a3a91081442a596afe3658e33d508b1250a8a2424a2f05d732f9def71719f13fc6c2ba2010816a362d6f6e23213f27d9437b45a06ad0d970bf15ec8f205808ff0faa6110beeaa95771d25a900000000000000000000c0000000069000000000058a714540000000000c11aac2ce2e2df2d62ed7156d84081e660c147cfca16e4d161e7b38765600145a5a99f01085ca6082d2b2c688b41b9e04e94c8d53228b519e485cf400ce3fd82dea93d2d80000000000000000000000000000000000000000000000000000006000040bcac26026a806d036cde7604d538a37c6ae77370116eed62524a32511611a34940093ef26fe8351f78bc78b23074eab5667bcdc8b5bc7528f763eb85ec720923dece00000000000af0318b4000000000088008134307d91be101339fb52ffec61ff7db66915f13264e8ba99f2d49b91b41e7b7c011d48840a2152cb57f1b2c719ea8458928545121251782eb997cef7b8b8cf89fe3615d100840b51b16b7b711909f93eca1bda2d035686cb85f8af647902c047f87d530885f7554ab8000800f00003ffffffffffc0081336fd0967a5266b8509a0cca2c070e324bb7877cc7041a1798a7a5bf2b9e1a1400f40003ffffffffffa0040cb42f0fe720c95aa524b2a6a9fd9aadd2907bbad6a6ebafcd787d31304a386a10000ffffffffffe8fbc9bfa0d47de2f1e2c8c1d3aad599ef3722d6f1d4a3dd8fae17b1c8248f7b3813adbf0003a2000090907e23eae5a374cf5b46993d23a99ae4f30cbc431eacdbd08f701b35a74a1092dea386c4e84d003de090f1d2fca13ff4ecc94a9a6137f41d349ef39d859c0e10d25ff5fe09a55c423d28c3f673b0ebae9e65c8213a43ab407a8cc24000000004eb6fc000e8800016b0b2bc400040240000000000000000400000fa000000190", + hex"00000303933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b13400045b99a64aeed970a4f92f84b3f38063090000000000000222000000003b9aca000000000000002af800000000000000010090001e000bd48a64bdaacd4b8d49aea9ceffe363deeb4c1124a048c380000000c501ecc90ed67abfa96f252bf6924edbedf8ebaaf6e148a50189db31959b045179cb00000000000001110000000ba43b7400000000000000157c00000000000000008048000f0158af8165d00273c406f0bf73ad5fd8467c595a43f1bad6f8af1da23dd7aa3bca017d003b4e4757da025d2164040c8e57c09de74bc5cee28b7efd2e30dd9809294801688e6f276aec12caa551029ba7145b7a0c3c813b212a1b0f753be75969b0965701e5c8d50f1e23a0f5cfde446605023520b2f74422f9903e32a8410757a5ba765101655c55164d6a3930054489c171af4ccf27b5a15a1fc53d52dab58c05c20805f400000000c400000000000000000000000000690000000000000000000000000020c85580001267e134d8edb38fdda01b44375f55825c4562ba64d3d82c848039fffcb89131bd000000000015f0640800000000001100106a193df9a96acadb9438baee04c119e320b2331bd3208d9eb1dd75c18433dc8a0023a9108158af8165d00273c406f0bf73ad5fd8467c595a43f1bad6f8af1da23dd7aa3bca1081c350e29f8d9da9000adc66ec0897296fb912c0da3725cb05bf40575ef9b2c342a957009781000000000080e7e134d8edb38fdda01b44375f55825c4562ba64d3d82c848039fffcb89131bd00000000002f7537c000eb180800000000000b000a50d500b470598c27b2f19860c1802d0666bc70a582002418228110804faac2eeeb521f9bbaa3902e50aed9361f331366b547801893f10beb4f7c8745811030c92fa725c360f64a46782ec62b1a0126fb06abeec926745a2f3345fcaa3f4e00a39822011038532f43281c1a1fd051a7bab7a9f54a2f77adf9e06e785e951366cd5004bd7081103002f7cba5acdbcf3a83eb147cd27db12027ee01217ffe77459468b36ec868f180a3a9108158af8165d00273c406f0bf73ad5fd8467c595a43f1bad6f8af1da23dd7aa3bca1081c350e29f8d9da9000adc66ec0897296fb912c0da3725cb05bf40575ef9b2c342a9571897d390000000000000000000000000000069000000000020c855800000000000000000469c5ab874ed9583c096692d602dfdc014932b0bc7b01d3e1b4ef47d638de68301dd58d60f41002738b4fe6833dc074d5e91ff8f0bda1983a27fdc18624d268cfc80000000000000000000000000000000000000000000000000000000000040d4ac8ce1e4619ca0db4ee743ecf5f2455c6c6a43d687c4cfb5b8e094fb6eb6e2c00933f09a6c76d9c7eed00da21bafaac12e22b15d3269ec1642401cfffe5c4898de80000000000af832040000000000088008350c9efcd4b5656dca1c5d7702608cf19059198de99046cf58eebae0c219ee450011d48840ac57c0b2e80139e203785fb9d6afec233e2cad21f8dd6b7c578ed11eebd51de50840e1a8714fc6ced480056e3376044b94b7dc89606d1b92e582dfa02baf7cd961a154ab800019f84d363b6ce3f76806d10dd7d560971158ae9934f60b21200e7fff2e244c6f4275dda00019e00016cc22d34b1d45d911d1c60dc491698c6b425c2fa257162a79d2a612e7daa961f36eb450feae62abba32814c8b0a53a774927602afcc00a11a267ad20ac15f8d321a4bfebfc134ab8847a5187ece761d75d3ccb904274875680f519848000000009d77680006780002d60ef1a800000480000000000000000800001f4000000320", + hex"00000303933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b1340004ebc503c4cebac33c0e40b4bd0062bb280000000000000222000000003b9aca0000000000000186a000000000000000010090001e000bd48a3e5d4c9395b104c1a78aff6e13bcea167ffd7adf4380000000c5012d45627c1bbda9bb4db929146a5c07b5bc940d7fa6c09757d261c408cc85e6cd00000000000001110000000ba43b7400000000000000c35000000000000000008048000f014df6f2054f92a033e51aa9f9f5801f1188683a33b2e73f4a72baa1f02f6256bb01c515ac0e0cae509eeb7cec2f278a38efa4128f70535a49b6f8b8b2091f86fe16010499aea25e05e121b14f9623b2171cdbc883b65d738af0f2723ae6d0886a240801dc68be0218a6e9886c66125f2ae9375b12da9141bab72c1d9fd059885071c7ee011df98a5392f227e5e4361cb1fd852d011600af6db8fe20d9140d662327a0320000000000c40000000000000000000000000069000000000000000000000000012a05f2000012204effb553765cf4b4fa9c4f9361b9bfdfc10f52a4e05441f7708ee33d788ca6800000000015c04b4c0000000000110010311114c1dbee96874db3f3922726069b12fcc33ce9d243371f7cc58b9207d66a0023a910814df6f2054f92a033e51aa9f9f5801f1188683a33b2e73f4a72baa1f02f6256bb108154b4e6fc1c898b1f01abbcced96215045aff200051443a71300eab2dfdda6e162957009781000000000080a04effb553765cf4b4fa9c4f9361b9bfdfc10f52a4e05441f7708ee33d788ca6800000000019e2b44000bb7f4b80000000000b000a46907ae3546268a91ee157200033d49090aba53a8200239822011038d9a30f62d19cc2abf4149f822f77fa3c709e9812659857a9c67b389c16f72b811027d5aefa2b71770bcbf06d284f74194586d42711cae372d409674ea537a0f17700a4182281108075ef5c946ddffa94597a02a3432821d305d083b87973e2cd1f5e20e3f9671d5f01103d891f78f58a8f3410fe884bba2ad18e7fd6a3cd1d8e6bebdff067abcb2b542700a3a910814df6f2054f92a033e51aa9f9f5801f1188683a33b2e73f4a72baa1f02f6256bb108154b4e6fc1c898b1f01abbcced96215045aff200051443a71300eab2dfdda6e1629576f2e611000000000000000000000000000006900000000012a05f20000000000000000001342c18cb3346441382db1f15e6f903266533d9e80fa3ffdaba4c121d9cf290e816f7792df2e55a3839a73e68064529a93d181bd0081b9408971e457c5d3e80f5780000000000000000000000000000000000000000000000000000000000040874c16811ffab089eb0654c253515ee95a9386865b1746590830a150e07ee19cc00910277fdaa9bb2e7a5a7d4e27c9b0dcdfefe087a952702a20fbb847719ebc465340000000000ae025a6000000000008800818888a60edf74b43a6d9f9c91393034d897e619e74e9219b8fbe62c5c903eb350011d48840a6fb7902a7c95019f28d54fcfac00f88c4341d19d9739fa5395d50f817b12b5d8840aa5a737e0e44c58f80d5de676cb10a822d7f900028a21d3898075596feed370b14ab80000813bfed54dd973d2d3ea713e4d86e6ff7f043d4a93815107ddc23b8cf5e2329a276a3c00001e00014c3587bacd751833989db440b04e3495a0e42ad2044fabcbd9e8b5bba724d6a8b62340e984620a26650265285b41c8a42f92a753d5da3bb79492b00f4cf0afe921a4bfebfc134ab8847a5187ece761d75d3ccb904274875680f519848000000009da8f00000780002d636fea000080480000000000000000800001f4000000320", + hex"00000303933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b13400042cd2e941f255281c26398db6a8a1de680000000000000222000000003b9aca000000000000000bb800000000000000010090001e000bd48a7f3570da68d351d084e067be3550e493965570124380000000c50159d8b6f824f1b8c32b4dd0886a9e5855fec70543947058d18e07c4322d3b1f0180000000000001110000000ba43b740000000000000005dc00000000000000008048000f01a1fe7ec0cac2a7e02a182feb9c697565f4835c6564c9786328db766c325d7bae8143548f6a7480907ab5c8e9ef78c95619d21b9b7ce70b8d4a05bae665749797718175b52d552ae33fe2017d7212d40949c4719695a671d883ad3e3e94e6565b243381f27bdfe6152fccb9671e631a5b941806efff67dc529b928dc55eed5e9d98497e019791b75f609c86bdb28c80ccd97735044bd5762d99634d7cceacb8e8407dab2e00000000c40000000000000000130000000061c780000000000000000000000008f0d180001266638004d82ecec4f60c3eaf09feecd41fe91f0ed45aaf236caad9d4fdf6b005800000000015f0498200000000001100103e8a3acc14bc46082d4826fd7e2da218e73008c7398b69ba5f9a3a107b9b3fc38023a91081a1fe7ec0cac2a7e02a182feb9c697565f4835c6564c9786328db766c325d7bae9081e73346fb1bab357137655f7fb449dd72fbbda5429c04b4b5ea544137157203dca957009781000000000080e6638004d82ecec4f60c3eaf09feecd41fe91f0ed45aaf236caad9d4fdf6b00580000000005341794000a5830200000000000b000a14d220ab715289038289a0d378431ffe062bd62a0200241822811080551aff2f4d16aef1e6457cdff3e4cf3cdfb34d539caef94f65e0cc4d78bae8aa01103cbd98822f7052917ddc158371960e23c47e717ce29003a96ef5e6dcea90d13480a39822011022b5c79a42a6f612db89f76dc01582c3645aaa3ece241910f10e62ad2f9fad5f011029ab547e3c220d446890170989d9973ea8e7c6a187aa98508216e679d0ee6aae80a3a91081a1fe7ec0cac2a7e02a182feb9c697565f4835c6564c9786328db766c325d7bae9081e73346fb1bab357137655f7fb449dd72fbbda5429c04b4b5ea544137157203dca9575f8ed790000000000000000000130000000061c78000000008f0d18000000000000000007105f14b446ec2464b0d6fe32b93d0b318727275cb973bd0ae41dafaf7a2071e81823595882dd284591edac9ab18fbbbb16c2b4df3a7c3e5af378beac3439b2f5000000000000000000000000000000000000000000000000000000009000040fcf6c6b31358035c98d2081a4b039387f1813d40e042d20d349aa97f4ce177b7c0093331c0026c1767627b061f5784ff766a0ff48f876a2d5791b6556cea7efb5802c0000000000af824c100000000000880081f451d660a5e230416a4137ebf16d10c739804639cc5b4dd2fcd1d083dcd9fe1c011d48840d0ff3f60656153f0150c17f5ce34bab2fa41ae32b264bc31946dbb36192ebdd74840f399a37d8dd59ab89bb2afbfda24eeb97dded2a14e025a5af52a209b8ab901ee54ab8000c00f80003ffffffffff70020193e97472cfeb4f6a1ca143864418dae2c3410863cc5cc8eb855cfe21923a5d8003b0000ffffffffffe0040e5a306e9b800a535873bdf73a16b4711706612ce7a2556faa55ef4ec3c36b642007e0001ffffffffffb400817aec2b40ea189534d55de91c40b1b8149362a9877f3f9a098c869914138d20220001ffffffffffb5998e001360bb3b13d830fabc27fbb3507fa47c3b516abc8db2ab6753f7dac0162773b20000c0000117a5bebbccb9cb5d7b1d56ba8498fc2ad6f7101f72faf0e5e3852b618c059a0ba358fdb0ec9fa7ca23ba27e2f43585748ab314035056d246e9f8263815c97148a1a4bfebfc134ab8847a5187ece761d75d3ccb904274875680f519848000000009dcec80003000002db14607000080480000000000000000800001f4000000320", + hex"00000303933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134000418786b7ffc1d090ff422fb48a20d29c50000000000000222000000003b9aca00000000000000271000000000000000010090001e000bd48a7bef1576f01a4506a156e3e30aaa6e0ec125b3c2c380000000c5010354534b9ebaec0ae187e0a3697f92f831df3a18d2b3a3da158f47069176b30580000000000001110000000ba43b7400000000000000138800000000000000008048000f0184fbcd70fe378a7edc0a335fd39b060a40d76063e5b0d3bc6889e2ae65c1060a01cc0288fd93f70ace819922418aa118be539ccd6334aa2a5a8e20499330fb021e818cc753377e21bd0cb66ef7ad10f9f10fbd22eb5bb9250efc5028f14fb040ffc2810de16dff398d4657f0b28d52ecf82310600024e51821f107d8d099e05b6f4c148129c7f876b32b47c3de83fe7ffb645f9c7bdb29db902e898fd58b7d2e2675897e00000000c400000000000000000400000000690000000000000b73ef000000001dc1f1110012714dd238ed32ff6e81e9ad0a3a84b561e7e785dc120da79c9432382bac9cf8d6000000000015a02107800000000011001037a7f76b6efef5ac72c901f32db8e406d24746171635a377364ded75b763e7918023a910816cdc4a185fbd2a32c613ba25b722e9c5c9d9a50b26cf6fbc1e23e5392c2a2125908184fbcd70fe378a7edc0a335fd39b060a40d76063e5b0d3bc6889e2ae65c1060a295700ad01000000000080f14dd238ed32ff6e81e9ad0a3a84b561e7e785dc120da79c9432382bac9cf8d600000000001b52bcc0016e828000000000001100105eab83caf9fbec9f0a096120c1a393543fd68cd1c08df9b5b08d8b0775cf484e2c520700000000000b000a7185d95efec83c7c89d8430a5e84ed96b8d7471582002398220110135e7d229629d102ea8a96e5e5fcb0050a38855c2e307f71f3922ce75d8e6e7301101bfcc6d4caacf93b7550289851cc50b653b63fe73b7f3fc008ad2ba97b3f877b00a418228110805335b016ed586154b60a26aea1b107188c4e2552d4f32b3addfa10329bd444b50110027e798f3a1368ba9cdcd08694b4ed3a0fa195118999ea711a2db08bd282dc8500a3a910816cdc4a185fbd2a32c613ba25b722e9c5c9d9a50b26cf6fbc1e23e5392c2a2125908184fbcd70fe378a7edc0a335fd39b060a40d76063e5b0d3bc6889e2ae65c1060a29577547589000000000000000000004000000006900000000001dc1f11100000000000b73ef3cdec220d901aec16b5ec448f99e8cd7082b4e3ff7f0b211feec60b1c78b28cc01e51fcd6b19f388491459f68085af5f82ffafab8c565acfbcf7b6459e8c5c44d100000000000000000000000000000000000000000000000000000002000040de6c087f829e88a9323c0589c10e73ae84762c6b180befc1dd188455e117f28b000938a6e91c76997fb740f4d6851d425ab0f3f3c2ee0906d3ce4a191c15d64e7c6b00000000000ad01083c0000000000880081bd3fbb5b77f7ad6396480f996dc72036923a30b8b1ad1bb9b26f6badbb1f3c8c011d48840b66e250c2fde95196309dd12db9174e2e4ecd2859367b7de0f11f29c96151092c840c27de6b87f1bc53f6e0519afe9cd8305206bb031f2d869de3444f15732e0830514ab8000400f40003ffffffffffe0040441103ca17be2cdab1bc90a5469eefad9285a46b1dec58f3a3cc9c55f0d9809d0000fffffffffff8e29ba471da65fedd03d35a1475096ac3cfcf0bb8241b4f39286470575939f1ac13bf3500001b0000abcb596c165adc624b345b4e4425c1c30ff019cc82ea504745053ae94abcae87913271f55516d8adb27d782d8c178cafb42e8533d557bfbef2e479a62630d73cd0d25ff5fe09a55c423d28c3f673b0ebae9e65c8213a43ab407a8cc24000000004efcd400006c00016b805efc00040240000000000000000400000fa0000001900", + hex"00000303933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b13400046c04b597cf1d81b9b84c7c7c70bc6d800000000000000222000000003b9aca0000000000000003e800000000000000010090001e000bd48a54f5b8e9bd78ae126232c00455abc7e1e60844a9c380000000c501ca2634aa6ad1e63689ee41fca10fcdf57d77e4a26efa23f77331b5ad23bf3eb4800000000000011e8000000002f34f6000000000000001f400000000000001f4004800f181dd29f2812dd081b7cb819f400d166cd3e30d0bc7f0c6e9449212355e9b9218080102e53cb2fd643591b4542baccb599bec0a51844d12555ff354adbb967ced6619812088fdc0456c13b9ccff78bce7990845cea4dd30775641b018ae86200a7869a6016568e3a0348f0f410c03de75cb037d7d448db942f13d057a3d541abd992c1a95813e98e684dfe48d37a34a741ab8d27865724ff8795e24ba83ce05b0ff80168fd18000000000800000000000000000000000186a00000000000000000000000002faf08000124975c688708ceffbfa00f0fcc93870e9f6a2a59997523b142e8a7de2c3f42332800000000015d0430080000000001100103f4c709e66ac023abe6d04cb9d78da46697851be43f73ec573a7d7238061666d0023a91081401444725d8a3adc3ec4ae32ecdee5d613e25136c5a7c54e47b1618e874c6c7d9081dd29f2812dd081b7cb819f400d166cd3e30d0bc7f0c6e9449212355e9b9218082957009781000000000080c975c688708ceffbfa00f0fcc93870e9f6a2a59997523b142e8a7de2c3f4233280000000000ad8a54000a3318080000000000b000a4f19d1f5661d894d6bae2860386ea141864b0809020023982201102b090849b4f58e151beced54974499157789508b2f012294ecef706191f1b8a501103b4691d19046c01950ae9b366b6e31019bc0fb5f379c026c5218e9a7f5cff2ef80a4182281108040df79dcef15bf5567fc8bb3dd3053ce4d18b78ba1602d0fe0c0344133e402bd01101954041195024719b50fdcd93eecb814be70100d5203bd3fa20a217e0d3a39c180a3a91081401444725d8a3adc3ec4ae32ecdee5d613e25136c5a7c54e47b1618e874c6c7d9081dd29f2812dd081b7cb819f400d166cd3e30d0bc7f0c6e9449212355e9b92180829571598f7900000000000000000000000000000186a0000000002faf08000000000000000005123401c95c7b9e3a1aa09defedce700ccd54ac16a1357a65de3c5d1e75911d98178215b7d9d0c50400eb5cf577720032a439ea57f56101a638fa283415c4ed95280000000000000000000000000000000000000000000000000000000000040ae36987e760a08a09af69bf1204953a8a8459e1652b3191ab97252df4b6e2341c00924bae344384677fdfd00787e649c3874fb5152cccba91d8a17453ef161fa119940000000000ae8218040000000000880081fa6384f3356011d5f368265cebc6d2334bc28df21fb9f62b9d3eb91c030b3368011d48840a00a22392ec51d6e1f625719766f72eb09f1289b62d3e2a723d8b0c743a6363ec840ee94f94096e840dbe5c0cfa0068b3669f18685e3f86374a249091aaf4dc90c0414ab8000125d71a21c233bfefe803c3f324e1c3a7da8a96665d48ec50ba29f78b0fd08cca2793ee00007a0001fcc2f2c25b8ffbad20e1a51323e89a71a54e4258ee5ee4fd13dfa8d3077dcc4b90a4d9316fbcb23291b988364bec1c736e7fbed243f37ce29ca41287b5ecedf65d12699dcd67dcd22d2620df7500767ec601669f72fa2b153bdc0d11198cee39b3e5002b0c241c15dac6e5dc7571f30245c1d9fe852aeb898371ba60f922c1d796799fdb2a65210e7d3a0832f1e6bc8fe11132b6d327781e4b5795bc7e3661bbac65ce540f2657073ac112275f9a89878554012c541e4735984fa290a677129689cb15751cbaa1ee5782ea899df0ca12ce82e27a5dedd92c7a18240a80ea0cbb8ccec008b86b6df2c6ba688bf5fafed386a9eef3c41d0801221011c2e9aa3d11000021a4bfebfc134ab8847a5187ece761d75d3ccb904274875680f519848000000009e4fb80001e800001c99c425578eb58841cbf2f7f2e435e796c654697b8076d4cedc90a7e1389589a01ca2634aa6ad1e63689ee41fca10fcdf57d77e4a26efa23f77331b5ad23bf3eb481401444725d8a3adc3ec4ae32ecdee5d613e25136c5a7c54e47b1618e874c6c7d81dd29f2812dd081b7cb819f400d166cd3e30d0bc7f0c6e9449212355e9b92180829e096742df5136cff532085c0e5e14be8e15fea12c60886f7b2303f9b52bd60166b3a3692bf8ca0441221affb5b529f3a3b476ace8c9a6ce42604c28b009be6a1a4bfebfc134ab8847a5187ece761d75d3ccb904274875680f519848000000009e4fb80001e80002d78c6870000004800000000000001f4000001f4000000320", + hex"00000303933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134000412097d0df71276a5f63f8e89fb099b5e0000000000000222000000003b9aca00000000000000138800000000000000010090001e000bd48a6fe687952d2abfec1db788e8362d9ca322a97b06c380000000c50124c327cbd080482144a5ead62152453771953e2c436b3274e417d4f06aa1c6bd8000000000000aaa000000003b9aca00000000000000138800000000000001f40048000c81a101511693e981f4d66cc3be8ebf2dacaeffc148359a54dbf8484194c635e5820182783c5e27ed7dbcb4ae8cfb3b424d434199944741a90a89e48b4e13bd4d2cc5019e4f2292a02ff95d4dea4bde6d8cb905b3a784247ed80eccc2d85df75150cea981354c5e9dada31d28ff594d4fb1886e4e96e74e11dacdeaed760b61b45407f49b818ff98e68eaabb7b0c3d1378dcf583f021bf58170c555446bf51cdd936d34d3a8000000008100000000000000000700000002a0db8000000000532d25000000000e93855b001211af2d9f5108fe8c6780269a7268739a088a5c095bd8533b2cf1e8c69d80927b00000000001590508380000000001100102592982f6a3d87edbdac73880345c703a3566e46a5c93e461239d60813aa722c0023a91081a101511693e981f4d66cc3be8ebf2dacaeffc148359a54dbf8484194c635e5821081bd33094577f9746a581f1c099e3bc7f3ac2bd42c12ee6b90c8d78d0425ea5417295700ad0100000000008091af2d9f5108fe8c6780269a7268739a088a5c095bd8533b2cf1e8c69d80927b000000000027d36640014b15000000000000110010795c0e513c6cb821be485543ad63fa40b757cbe0b766b10af69f1e289c141d821ed40180000000000b000a01460f121b1742b263c81e7c514b4845462a699b020023982201102c40e8cc2f700066249d00407069066bc2c5464cebc2d451b2a7c6f85e07059801103c00b5ed53ab65d50aaec7aeb0373504b3d69610218fd20494fd8f0c733cfaa480a41822811080578c4cc8cc478a3737f62f3594277d632c25f301abf1dcb32ddd8161b126625b01100463507612d429451c5e3c6b7e558f0fae8173985488f93260877fb3d2ea341b00a3a91081a101511693e981f4d66cc3be8ebf2dacaeffc148359a54dbf8484194c635e5821081bd33094577f9746a581f1c099e3bc7f3ac2bd42c12ee6b90c8d78d0425ea541729576a455e100000000000000000000700000002a0db800000000e93855b0000000000532d257b4e95eb654864c0c1a5a8bedea7ddae80ba8764bcc1901d774e4bdf4490dc5c014f6e3aa79b07ea36f6239245bf31e8779710939c8eff24dc801060177753537e00000000000000000000000000000000000000000000000000000002000040f7e75060488a8feca76d01572a81ba3e65cd756589fda2c29bb1bd38c6ebd40f400908d796cfa8847f4633c0134d393439cd04452e04adec299d9678f4634ec0493d80000000000ac82841c00000000008800812c94c17b51ec3f6ded639c401a2e381d1ab372352e49f23091ceb0409d539160011d48840d080a88b49f4c0fa6b3661df475f96d6577fe0a41acd2a6dfc2420ca631af2c10840de9984a2bbfcba352c0f8e04cf1de3f9d615ea16097735c8646bc68212f52a0b94ab8000c00f40003ffffffffffe00403628282371cbd50e312e846bc4bb1bdc25c3c9e15c153b6ddd9554d218fcdc90007c0001ffffffffffe80103144e0b3492841cee73bb7102da710023d0eb43dce3461c012c5637425b374e0801f80007ffffffffff90020fc6a3795285dc99baafffcf9eb2f432f427ff9deda875d21fff0efc8aedf31f580007ffffffffff911af2d9f5108fe8c6780269a7268739a088a5c095bd8533b2cf1e8c69d80927b09e60d800009800047c140c3d9812a251d71c21cfe25647e8213a46892955bea39a619d2d87b511bcb68b122e3ceac40167a22f75fc61d4f0606227f5fd974667e66d05426ef39d428692ffaff04d2ae211e9461fb39d875d74f32e4109d21d5a03d46612000000002798360000260000b71786f40002012000000000000007d0000007d0000000c800", + hex"00000303933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b1340004a4a962577971b6a380ff91e9e02f4fde000000000000022200000002540be400000000000000271000000000000000010090001e000bd48a7e7bdb6769b03f71d77ed506c775bc16604701604380000000c1013801c23a546ec519efc587c4bf9b88afd651d6857d3f29466dc5a5d45b086a220000000000000aaa000000003b9aca00000000000000271000000000000001f40048000c81a621eea5fb4bf52b494cb5c6f8e2239d3b00ded351bdb08918191c6e811992b781dcb985906a311f04d162241d0bdd95cdc064c1bc00ba66c9d74878578bec712401f028efe204476baac4cba09366af71e9548547ea58c5c776d616504d130ff8760152a5ecc6e185cc3714642a5e1abeb861d58caf8a469f03f9fb66a6e70001336781a2bdaf62f43d9b32fe402a8a551aabd75829ebf963b625cb720cfd248b6090a680000000810000000000000000000000000002710000000000000000000000001dcd65000012038147ba498c54032286b50fc64d00d03952ec2e8cc84889ecc9bcb435d1f4bc800000000015a0210780000000001100106287220a6f3fbcd618c14c8dd8c721980e88bb2309af9c339000b191ef450cff8023a91081a621eea5fb4bf52b494cb5c6f8e2239d3b00ded351bdb08918191c6e811992b79081ef261ede0d50d655d8a2b10e1517da9b3d1db9f6ab04e773daed4150836d0d12a957009701000000000080838147ba498c54032286b50fc64d00d03952ec2e8cc84889ecc9bcb435d1f4bc8000000000535472c000db9f0780000000000b000a32c34a7ece80c3f9abdb9bee77d17382359d3dd502002398220110070eac66bd8d8f47892fa238f47c9ff3358fe5d65f5e8d52e1385542aa9b1cc40110352a047be2074990f2618600ae095f09d68a3f120f87a6995eab34f23fb28ac800a398220110201569efcd4ea0dfd9a960304b2498bcc09aca24682075f6aaa8fda844c8d45181103f820404fcc0638bbb5900d370bbd4a96b24754f3b7dfbe00f4328aff17ea45200a3a91081a621eea5fb4bf52b494cb5c6f8e2239d3b00ded351bdb08918191c6e811992b79081ef261ede0d50d655d8a2b10e1517da9b3d1db9f6ab04e773daed4150836d0d12a95728a48b1000000000000000000000000000000271000000001dcd650000000000000000004ab1ded8f41c237c7696f83b49e9ef147442b038de36d0c12780919ac86a8e04016a8091e010f7088ee0100c0816d5b96361f30cfcb64a8fe3dfb16fe53ec5eca80000000000000000000000000000000000000000000000000000000000004096e590a43d31f1e3ff97afbde081569dbd0d4f2040503a3291fc4573ffdc6b78000901c0a3dd24c62a0191435a87e32680681ca9761746642444f664de5a1ae8fa5e40000000000ad01083c00000000008800831439105379fde6b0c60a646ec6390cc07445d9184d7ce19c80058c8f7a2867fc011d48840d310f752fda5fa95a4a65ae37c7111ce9d806f69a8ded8448c0c8e37408cc95bc840f7930f6f06a86b2aec5158870a8bed4d9e8edcfb558273b9ed76a0a841b6868954ab800000e051ee92631500c8a1ad43f19340340e54bb0ba33212227b326f2d0d747d2f22949ce000038000154911be04ca6953530013582f1dbbc219e8bbcb638ff8f50c6d083ce6267716e955127b2d47fdc36734f5dda822c41999f06565b3e5cf9fd740dd544f8a85b0021a4bfebfc134ab8847a5187ece761d75d3ccb904274875680f51984800000000a527380000e00002da2f5e98000804800000000000001f4000001f4000000320", + hex"00000303933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b13400042a85e26dff2a0673ca6296e001ac772c0000000000000222000000003b9aca00000000000000138800000000000000010090001e000bd48a4bbf36cccccda24ebc49ddbb5788a54f6472e0f94380000000c1017af289981f2b50125dd60e48097c4b206687e5e270d77addda5d33822f74d1ef8000000000000111000000001dcd650000000000000009c400000000000000008048000f01449d01657fea8c6addb6af91c3085177fc2ee4ea53c2e54f563483f2fa158346015da08f4834e5ebf637c0172e1891537f07cde25fba794b5aaf60357844779d04019926f90f40cee6ac1ebdfcbbca5e75a64c39b74701070e55bce95cdf2d2fcfe90113f0d92a02b97619183938fe2e33d5ce1731ac43fa1b9aaa07545bf0cacd6dee01f9d1f0d872ecf0c85c5ed2ceb3d44660970333d2412f531314fd139fa4fa8c3000000000c5000000000000000003000000003df000000000000e1f43800000000ed8933c80125e17209496a19fa72cf310e1b904367d920a52b1ca0bfb3f8d7778d8fce90721800000000015905083800000000011001001ad0cccb8ec1223eac85f40885e30d34c6768bcbcafd8b89569e6cd4ab870cf8023a91081449d01657fea8c6addb6af91c3085177fc2ee4ea53c2e54f563483f2fa1583461081ecadd4be4df0a73c91037884fff9c89ce56159bc702fac9ea5504c3991ee4e07a95700ac81000000000080de17209496a19fa72cf310e1b904367d920a52b1ca0bfb3f8d7778d8fce9072180000000004931a540011d838000000000001100103d8a2586fb04c925e4f42e81adc0591674443ed51eba9480ff266ef112ee05151aa00380000000000b000a735f150ab1fedb677f8542d06610946f45c546b80200239822011030923a3acfb7fe22b1ccc2abaa86e7ea7037066fcfd9b01826b45d5b0d153e1c8110109f79ab72544af4417ff66cca54f2c746a2795ad9469539c96197fcbf34f3bc00a3982201102aaf12427b38ccd5275c7f01519c3d51e437d9e324ba2350f57e5bf8aa5f48a6811029c0a5501742ae616b7465f0a70c54828ef261fa73f20828f39d283946a2b73a00a3a91081449d01657fea8c6addb6af91c3085177fc2ee4ea53c2e54f563483f2fa1583461081ecadd4be4df0a73c91037884fff9c89ce56159bc702fac9ea5504c3991ee4e07a95744bb8f9000000000000000000003000000003df0000000000ed8933c80000000000e1f43f44fec0b516ed5c36463cf41097c0a751be4fb1ad230f337de55fea885d4ea190172ec1ab7c699c0f19382f379449fce9fe0bf25edff9418619c6f02923ad963ef80000000000000000000000000000000000000000000000000000001000040a21436454107618d566629ff5bafbd35567da288a1dabb7b827599f8bf7477d900092f0b904a4b50cfd396798870dc821b3ec9052958e505fd9fc6bbbc6c7e748390c0000000000ac82841c00000000008800800d686665c760911f5642fa0442f1869a633b45e5e57ec5c4ab4f366a55c3867c011d48840a24e80b2bff546356edb57c8e18428bbfe17727529e172a7ab1a41f97d0ac1a30840f656ea5f26f8539e4881bc427ffce44e72b0acde3817d64f52a8261cc8f72703d4ab8000800f80003fffffffffff0020aa3ade905629ba9f18e965fed468f2d514fe6d146b5863e4c2087f4d65a8681c003f0000fffffffffffa0041862f3d4278167c52104b5f77f468da29945743dffd734eebe4576b9e2e156dab0000fffffffffffabc2e41292d433f4e59e621c372086cfb2414a5639417f67f1aeef1b1f9d20e4314af790000260000adb86dbd5ef456ad0f73fe92712aab2d8856bb72ee43242042fcd6e4a5786bdf451b89629976c2fc2a84cc37642b6bfeadea98b1ba0e264cbe93b1016fc6393650d25ff5fe09a55c423d28c3f673b0ebae9e65c8213a43ab407a8cc240000000052bde400009800016d6bda5c00040240000000000000000400000fa0000001900", hex"00000303933884AAF1D6B108397E5EFE5C86BCF2D8CA8D2F700EDA99DB9214FC2712B134000456E4167E3C0EB8C856C79CA31C97C0AA0000000000000222000000012A05F2000000000000028F5C000000000000000102D0001E000BD48A2402E80B723C42EE3E42938866EC6686ABB7ABF64380000000C501A7F2974C5074E9E10DBB3F0D9B8C40932EC63ABC610FAD7EB6B21C6D081A459B000000000000011E80000001EEFFFE5C00000000000147AE00000000000001F403F000F18146779F781067ED04B4957E14F1C5623AB653039B2B1D49910240848E4E682DB20131AD64F76FAF90CD7DE26892F1BDAB82FB9E02EF6538D82FF4204B5348F02AE081A5388E9474769D69C4F60A763AE0CCDB5228A06281DE64408871A927297FDFD8818B6383985ABD4F0AC22E73791CF3A4D63C592FA2648242D34B8334B1539E823381BB1F1404C37D9C2318F5FC6B1BF7ECF5E6835B779E3BE09BADCF6DF1F51DCFBC80000000C0808000000000000EFD80000000007F00000000061A0A4880000001EDE5F3C3801203B9C79160B5123CADE575E370480B57B0C816EB35DD7B27372EDA858622EB1E808000000015FFFFFF800000000011001029DFB814F6502A68D6F83B6049E3D2948A2080084083750626532FDB437169C20023A9108146779F781067ED04B4957E14F1C5623AB653039B2B1D49910240848E4E682DB21081B30694071254D8B3B9537320C014B8CB1052E5514F5EFC19CF2EB806308D5CF1A95700AD0100000000008083B9C79160B5123CADE575E370480B57B0C816EB35DD7B27372EDA858622EB1E80800000001961B4C001618F8180000000001100102E648BA30998A28C02C2DFD9DDCD0E0BA064DA199C55186485AFAB296B94E704426FFE00000000000B000A67D9B9FAADB91650E0146B1F742E5C16006708890200239822011026A6925C659D006FEB42D639F1E42DD13224EE49AA34E71B612CF96DB66A8CD4011032C22F653C54CC5E41098227427650644266D80DED45B7387AE0FFC10E529C4680A418228110807CB47D9C1A14CB832FB361C398EA672C9542F34A90BAD4288FA6AC5FC9E9845C01101CF71CAE9252D389135D8C606225DCF1E0333CCDF1FAE84B74FC5D3D440C25F880A3A9108146779F781067ED04B4957E14F1C5623AB653039B2B1D49910240848E4E682DB21081B30694071254D8B3B9537320C014B8CB1052E5514F5EFC19CF2EB806308D5CF1A9573D7C531000000000000000000F3180000000007F00000001EDE5F3C380000000061A0A48D64CA627B243AD5915A2E5D0BAD026762028DDF3304992B83A26D6C11735FC5F01ED56D769BDE7F6A068AF1A4BCFDF950321F3A4744B01B1DDC7498677F112AE1A80000000000000000000000000000000000000658000000000000819800040D37301C10C9419287E9A3B704EB6D7F45CC145DD77DCE8A63B0A47C8AB67467D800901DCE3C8B05A891E56F2BAF1B82405ABD8640B759AEEBD939B976D42C311758F40400000000AFFFFFFC00000000008800814EFDC0A7B2815346B7C1DB024F1E94A451040042041BA83132997EDA1B8B4E10011D48840A33BCFBC0833F6825A4ABF0A78E2B11D5B2981CD958EA4C881204247273416D90840D9834A03892A6C59DCA9B990600A5C65882972A8A7AF7E0CE7975C031846AE78D4AB8002000EC0003FFFFFFFF86801076D98A575A4CDFD0E3F44D1BB3CD3BBAF3BD04C38FED439ED90D88DF932A9296801A80007FFFFFFFF4008136A9D5896669E8724C5120FB6B36C241EF3CEF68AE0316161F04A9EE3EAFF36000FC0003FFFFFFFF86780106E4B5CC4155733A2427082907338051A5DA1E7CA6432840A5528ECAFFA3FB628801B80007FFFFFFFF10020CA4E125E9126107745D4354D4187ABCDE323117857A1DCEB7CCF60B2AAFA80C6003A0000FFFFFFFFE1C0080981575FD981A73A848CC0243CB467BF451F6811DAF4D71CAD8CE8B1E96DB190C01000003FFFFFFFF867400814C747E0FD8290BE8A3B8B3F73015A261479A71780CD3A0A9270234E4B394409C00D80003FFFFFFFF90020E1B9C9B10A97F15F5E1BB27FC8AC670DF8DADEAE4EDFAFB23BDD0AC705FDF51600340000FFFFFFFFF0020AD2581F3494A17B0BE3F63516D53F028A204FD3156D8B21AA4E57A8738D2062080007FFFFFFFF0CE83B9C79160B5123CADE575E370480B57B0C816EB35DD7B27372EDA858622EB1E0B8C1E00000B8000FA46CC2C7E9AB4A37C64216CD65C944E6D73998419D1A1AD2827AB6BC85B32280230764E374064EC82A3751E789607E23BEAE93FB0EDDD5E7FA803767079662E80EAEF384E2AFCB68049D9DC246119E77BD2ED4112330760CAB6CD3671CFCE006C584B9C95E0B554261E00154D40806EA694F44751B328A9291BAD124EFD5664280936EC92D27B242737E7E3E83B4704BA367B7DA5108F2F6EDFB1C38EE721A369E77EED71B12090BAEAAAC322C1457E31AB0C4DE5D9351943F10FD747742616A1AABD09F680B37D4105A8872695EE9B97FAB8985FAA9D747D45046229BF265CEEB300A40FE23040C5F335E0515496C58EE47418B72331FCC6F47A31A9B33B8E000008692FFAFF04D2AE211E9461FB39D875D74F32E4109D21D5A03D46612000000002E307800002E0002069FCA5D3141D3A78436ECFC366E31024CBB18EAF1843EB5FADAC871B42069166C0726710955E3AD621072FCBDFCB90D79E5B1951A5EE01DB533B72429F84E2562680519DE7DE0419FB412D255F853C71588EAD94C0E6CAC7526440902123939A0B6C806CC1A501C495362CEE54DCC830052E32C414B95453D7BF0673CBAE018C23573C69C694A8F88483050257A7366B838489731E5776B6FA0F02573401176D3E7FAEEF11E95A671420586631255F51A0EC2CF4D4D9F69D587712070FE1FB9316B71868692FFAFF04D2AE211E9461FB39D875D74F32E4109D21D5A03D46612000000002E307800002E0002BA11BBBA0202012000000000000007D0000007D0000000C800000007CFFFF83000", hex"00000303933884AAF1D6B108397E5EFE5C86BCF2D8CA8D2F700EDA99DB9214FC2712B1340004D443ECE9D9C43A11A19B554BAAA6AD150000000000000222000000003B9ACA0000000000000249F000000000000000010090001E800BD48A22F4C80A42CC8BB29A764DBAEFC95674931FBE9A4380000000C50134D4A745996002F219B5FDBA1E045374DF589ECA06ABE23CECAE47343E65EDCF800000000000011E80000001BA90824000000000000124F800000000000001F4038500F1810AE1AF8A1D6F56F80855E26705F191BB07CD4E2434BC5BB1698E7E5880E2266201E8BFEEEEED725775B8116F6F82CF8E87835A5B45B184E56F272AD70D6078118601E06212B8C8F2E25B73EE7974FDCDF007E389B437BBFE238CCC3F3BF7121B6C5E81AA8589D21E9584B24A11F3ABBA5DAD48D121DD63C57A69CD767119C05DA159CB81A649D8CC0E136EB8DFBD2268B69DCA86F8CE4A604235A03D9D37AE7B07FC563F80000000C080800000000000271C000000000177000000002808B14600000001970039BA00123767F0F4F00D5E9FDF24177EF2872343D9F8FAEC65D3048BA575E70E00A0AB08800000000015E070F20000000000110010584241B5FB364208F6E64A80D1166DAD866186B10C015ED0283FF1C308C2105A0023A910810AE1AF8A1D6F56F80855E26705F191BB07CD4E2434BC5BB1698E7E5880E226621081DE8ADFA110DC8A94D8B9E9EF616BAE8598287C8F82AFDF0FC068697D570266FDA95700AD81000000000080B767F0F4F00D5E9FDF24177EF2872343D9F8FAEC65D3048BA575E70E00A0AB0880000000003E7AEDC0011ABE8A00000000001100101A9CE4B6AEF469590BC7BCC51DCEEAE9C86084055A63CC01E443C733FBE400B9B5B16800000000000B000A5E5700106D1A7097E4DE87EBAF1F8F2773842FA482002418228110805E84989A81F51ABD9D11889AE43E68FAD93659DEC019F1B8C0ADBF15A57B118B81101DCC1256F9306439AD3962C043FC47A5179CAAA001CCB23342BE0E8D92E4022780A4182281108074F306DA3751B84EC5FFB155BDCA7B8E02208BBDBC8D4F3327ABA557BF27CD1701102EF4AC8CC92F469DA9642D4D4162BC545F8B34ADE15B7D6F99808AA22B086B0180A3A910810AE1AF8A1D6F56F80855E26705F191BB07CD4E2434BC5BB1698E7E5880E226621081DE8ADFA110DC8A94D8B9E9EF616BAE8598287C8F82AFDF0FC068697D570266FDA9576F8099900000000000000000271C00000000017700000001970039BA000000002808B14648CE00AE97051EE10A3C361263F81A98165CE4AA7BA076933D4266E533585F24815C15DEACF0691332B38ECF23EC39982C5C978C748374A01BA9B30D501EE4F26E8000000000000000000000000000000000001224000000000000004B800040A911C460F1467952E3B99BED072F81BFB4454FF389636DCB399FE6A78113C28580091BB3F87A7806AF4FEF920BBF794391A1ECFC7D7632E98245D2BAF3870050558440000000000AF0387900000000000880082C2120DAFD9B21047B732540688B36D6C330C3588600AF68141FF8E18461082D0011D488408570D7C50EB7AB7C042AF13382F8C8DD83E6A7121A5E2DD8B4C73F2C407113310840EF456FD0886E454A6C5CF4F7B0B5D742CC143E47C157EF87E03434BEAB81337ED4AB8001C00F40003FFFFFFFEC7200403248A1D44DFA3AC9EC237D452C936400CAA86E9517CCCF2A8F77B7493CD70B6A00780001FFFFFFFF63A0041826829646B907A97FBD1455EA8673A12B8E7AA6EA790F7802E955CE3B69DE57E006E0001FFFFFFFF640081E51EB1F91218821E680B50E4B22DF8B094385BD33ACAE36BFC9E8C2F5AD2DA5400EC0003FFFFFFFEC7801047C26AD5435658D063EBCF73A5D0EEFE73ED6B73426246E8DFB3A21D1C4C7465001900007FFFFFFFE0040B115AC58BAAA900195893EA3B2AB408D2AD348AD047E3B6CB15E599625E38608006A0001FFFFFFFF7002033C39A21A38BB61F6FB33623771A9356D8885B7C12C939C770C939EF826286C200360000FFFFFFFFB4008104EF4271064A0973B053727C3E67352D00E25CAEED944F50782449CEAE8F50960001FFFFFFFF6390DD9FC3D3C0357A7F7C905DFBCA1C8D0F67E3EBB1974C122E95D79C380282AC222B21FA0007920001295AA1FB77029F7620A90EF7AE6A6CD31E4588B93264A7ADB76152D535C52E90B9E1B7C2376DABA316A6290F1A9730D4E5E44D0B1CB0EE6A795702E6A6BCDFCDA1A4BFEBFC134AB8847A5187ECE761D75D3CCB904274875680F51984800000000AC87E8001E480002E884D2A8080804800000000000001F4000001F40000003200000001BF08EB000" ) @@ -122,7 +121,7 @@ class ChannelCodecsSpec extends AnyFunSuite { // and we encode with new codec val newbin = stateDataCodec.encode(oldnormal).require.bytes // make sure that encoding used the new codec - assert(newbin.startsWith(hex"020002")) + assert(newbin.startsWith(hex"030002")) // make sure that round-trip yields the same data val newnormal = stateDataCodec.decode(newbin.bits).require.value assert(newnormal === oldnormal) @@ -133,8 +132,8 @@ class ChannelCodecsSpec extends AnyFunSuite { // this test makes sure that we actually produce the same objects than previous versions of eclair val refs = Map( - hex"00000303933884AAF1D6B108397E5EFE5C86BCF2D8CA8D2F700EDA99DB9214FC2712B134000456E4167E3C0EB8C856C79CA31C97C0AA0000000000000222000000012A05F2000000000000028F5C000000000000000102D0001E000BD48A2402E80B723C42EE3E42938866EC6686ABB7ABF64380000000C501A7F2974C5074E9E10DBB3F0D9B8C40932EC63ABC610FAD7EB6B21C6D081A459B000000000000011E80000001EEFFFE5C00000000000147AE00000000000001F403F000F18146779F781067ED04B4957E14F1C5623AB653039B2B1D49910240848E4E682DB20131AD64F76FAF90CD7DE26892F1BDAB82FB9E02EF6538D82FF4204B5348F02AE081A5388E9474769D69C4F60A763AE0CCDB5228A06281DE64408871A927297FDFD8818B6383985ABD4F0AC22E73791CF3A4D63C592FA2648242D34B8334B1539E823381BB1F1404C37D9C2318F5FC6B1BF7ECF5E6835B779E3BE09BADCF6DF1F51DCFBC80000000C0808000000000000EFD80000000007F00000000061A0A4880000001EDE5F3C3801203B9C79160B5123CADE575E370480B57B0C816EB35DD7B27372EDA858622EB1E808000000015FFFFFF800000000011001029DFB814F6502A68D6F83B6049E3D2948A2080084083750626532FDB437169C20023A9108146779F781067ED04B4957E14F1C5623AB653039B2B1D49910240848E4E682DB21081B30694071254D8B3B9537320C014B8CB1052E5514F5EFC19CF2EB806308D5CF1A95700AD0100000000008083B9C79160B5123CADE575E370480B57B0C816EB35DD7B27372EDA858622EB1E80800000001961B4C001618F8180000000001100102E648BA30998A28C02C2DFD9DDCD0E0BA064DA199C55186485AFAB296B94E704426FFE00000000000B000A67D9B9FAADB91650E0146B1F742E5C16006708890200239822011026A6925C659D006FEB42D639F1E42DD13224EE49AA34E71B612CF96DB66A8CD4011032C22F653C54CC5E41098227427650644266D80DED45B7387AE0FFC10E529C4680A418228110807CB47D9C1A14CB832FB361C398EA672C9542F34A90BAD4288FA6AC5FC9E9845C01101CF71CAE9252D389135D8C606225DCF1E0333CCDF1FAE84B74FC5D3D440C25F880A3A9108146779F781067ED04B4957E14F1C5623AB653039B2B1D49910240848E4E682DB21081B30694071254D8B3B9537320C014B8CB1052E5514F5EFC19CF2EB806308D5CF1A9573D7C531000000000000000000F3180000000007F00000001EDE5F3C380000000061A0A48D64CA627B243AD5915A2E5D0BAD026762028DDF3304992B83A26D6C11735FC5F01ED56D769BDE7F6A068AF1A4BCFDF950321F3A4744B01B1DDC7498677F112AE1A80000000000000000000000000000000000000658000000000000819800040D37301C10C9419287E9A3B704EB6D7F45CC145DD77DCE8A63B0A47C8AB67467D800901DCE3C8B05A891E56F2BAF1B82405ABD8640B759AEEBD939B976D42C311758F40400000000AFFFFFFC00000000008800814EFDC0A7B2815346B7C1DB024F1E94A451040042041BA83132997EDA1B8B4E10011D48840A33BCFBC0833F6825A4ABF0A78E2B11D5B2981CD958EA4C881204247273416D90840D9834A03892A6C59DCA9B990600A5C65882972A8A7AF7E0CE7975C031846AE78D4AB8002000EC0003FFFFFFFF86801076D98A575A4CDFD0E3F44D1BB3CD3BBAF3BD04C38FED439ED90D88DF932A9296801A80007FFFFFFFF4008136A9D5896669E8724C5120FB6B36C241EF3CEF68AE0316161F04A9EE3EAFF36000FC0003FFFFFFFF86780106E4B5CC4155733A2427082907338051A5DA1E7CA6432840A5528ECAFFA3FB628801B80007FFFFFFFF10020CA4E125E9126107745D4354D4187ABCDE323117857A1DCEB7CCF60B2AAFA80C6003A0000FFFFFFFFE1C0080981575FD981A73A848CC0243CB467BF451F6811DAF4D71CAD8CE8B1E96DB190C01000003FFFFFFFF867400814C747E0FD8290BE8A3B8B3F73015A261479A71780CD3A0A9270234E4B394409C00D80003FFFFFFFF90020E1B9C9B10A97F15F5E1BB27FC8AC670DF8DADEAE4EDFAFB23BDD0AC705FDF51600340000FFFFFFFFF0020AD2581F3494A17B0BE3F63516D53F028A204FD3156D8B21AA4E57A8738D2062080007FFFFFFFF0CE83B9C79160B5123CADE575E370480B57B0C816EB35DD7B27372EDA858622EB1E0B8C1E00000B8000FA46CC2C7E9AB4A37C64216CD65C944E6D73998419D1A1AD2827AB6BC85B32280230764E374064EC82A3751E789607E23BEAE93FB0EDDD5E7FA803767079662E80EAEF384E2AFCB68049D9DC246119E77BD2ED4112330760CAB6CD3671CFCE006C584B9C95E0B554261E00154D40806EA694F44751B328A9291BAD124EFD5664280936EC92D27B242737E7E3E83B4704BA367B7DA5108F2F6EDFB1C38EE721A369E77EED71B12090BAEAAAC322C1457E31AB0C4DE5D9351943F10FD747742616A1AABD09F680B37D4105A8872695EE9B97FAB8985FAA9D747D45046229BF265CEEB300A40FE23040C5F335E0515496C58EE47418B72331FCC6F47A31A9B33B8E000008692FFAFF04D2AE211E9461FB39D875D74F32E4109D21D5A03D46612000000002E307800002E0002069FCA5D3141D3A78436ECFC366E31024CBB18EAF1843EB5FADAC871B42069166C0726710955E3AD621072FCBDFCB90D79E5B1951A5EE01DB533B72429F84E2562680519DE7DE0419FB412D255F853C71588EAD94C0E6CAC7526440902123939A0B6C806CC1A501C495362CEE54DCC830052E32C414B95453D7BF0673CBAE018C23573C69C694A8F88483050257A7366B838489731E5776B6FA0F02573401176D3E7FAEEF11E95A671420586631255F51A0EC2CF4D4D9F69D587712070FE1FB9316B71868692FFAFF04D2AE211E9461FB39D875D74F32E4109D21D5A03D46612000000002E307800002E0002BA11BBBA0202012000000000000007D0000007D0000000C800000007CFFFF83000" -> """{"commitments":{"localParams":{"nodeId":"03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134","channelKeyPath":{"path":[1457788542,1007597768,1455922339,479707306]},"dustLimitSatoshis":546,"maxHtlcValueInFlightMsat":5000000000,"channelReserveSatoshis":167772,"htlcMinimumMsat":1,"toSelfDelay":720,"maxAcceptedHtlcs":30,"isFunder":false,"defaultFinalScriptPubKey":"a9144805d016e47885dc7c852710cdd8cd0d576f57ec87","features":"8a"},"remoteParams":{"nodeId":"034fe52e98a0e9d3c21b767e1b371881265d8c7578c21f5afd6d6438da10348b36","dustLimitSatoshis":573,"maxHtlcValueInFlightMsat":16609443000,"channelReserveSatoshis":167772,"htlcMinimumMsat":1000,"toSelfDelay":2016,"maxAcceptedHtlcs":483,"fundingPubKey":"028cef3ef020cfda09692afc29e38ac4756ca60736563a93220481091c9cd05b64","revocationBasepoint":"02635ac9eedf5f219afbc4d125e37b5705f73c05deca71b05fe84096a691e055c1","paymentBasepoint":"034a711d28e8ed3ad389ec14ec75c199b6a45140c503bcc88110e3524e52ffbfb1","delayedPaymentBasepoint":"0316c70730b57a9e15845ce6f239e749ac78b25f44c90485a697066962a73d0467","htlcBasepoint":"03763e280986fb384631ebf8d637efd9ebcd06b6ef3c77c1375b9edbe3ea3b9f79","features":"81"},"channelFlags":1,"localCommit":{"index":7675,"spec":{"htlcs":[],"feeratePerKw":254,"toLocalMsat":204739729,"toRemoteMsat":16572475271},"publishableTxs":{"commitTx":{"txid":"e25a866b79212015e01e155e530fb547abc8276869f8740a9948e52ca231f1e4","tx":"0200000000010107738f22c16a24795bcaebc6e09016af61902dd66bbaf64e6e5db50b0c45d63d010000000032c3698002c31f0300000000002200205cc91746133145180585bfb3bb9a1c1740c9b43338aa30c90b5f5652d729ce0884dffc0000000000160014cfb373f55b722ca1c028d63ee85cb82c00ce1112040047304402204d4d24b8cb3a00dfd685ac73e3c85ba26449dc935469ce36c259f2db6cd519a8022065845eca78a998bc8213044e84eca0c884cdb01bda8b6e70f5c1ff821ca5388d01483045022100f968fb38342997065f66c38731d4ce592a85e6952175a8511f4d58bf93d308b8022039ee395d24a5a71226bb18c0c44bb9e3c066799be3f5d096e9f8ba7a88184bf101475221028cef3ef020cfda09692afc29e38ac4756ca60736563a93220481091c9cd05b642103660d280e24a9b16772a6e6418029719620a5caa29ebdf8339e5d700c611ab9e352ae7af8a620"},"htlcTxsAndSigs":[]}},"remoteCommit":{"index":7779,"spec":{"htlcs":[],"feeratePerKw":254,"toLocalMsat":16572475271,"toRemoteMsat":204739729},"txid":"ac994c4f64875ab22b45cba175a04cec4051bbe660932570744dad822e6bf8be","remotePerCommitmentPoint":"03daadaed37bcfed40d15e34979fbf2a0643e748e8960363bb8e930cefe2255c35"},"localChanges":{"proposed":[],"signed":[],"acked":[]},"remoteChanges":{"proposed":[],"acked":[],"signed":[]},"localNextHtlcId":203,"remoteNextHtlcId":4147,"originChannels":{},"remoteNextCommitInfo":"034dcc0704325064a1fa68edc13adb5fd173051775df73a298ec291f22ad9d19f6","commitInput":{"outPoint":"3dd6450c0bb55d6e4ef6ba6bd62d9061af1690e0c6ebca5b79246ac1228f7307:1","amountSatoshis":16777215},"remotePerCommitmentSecrets":null,"channelId":"07738f22c16a24795bcaebc6e09016af61902dd66bbaf64e6e5db50b0c45d63c"},"shortChannelId":"1513532x23x1","buried":true,"channelAnnouncement":{"nodeSignature1":"d2366163f4d5a51be3210b66b2e4a2736b9ccc20ce8d0d69413d5b5e42d991401183b271ba032764151ba8f3c4b03f11df5749fd876eeaf3fd401bb383cb3174","nodeSignature2":"075779c27157e5b4024ecee12308cf3bde976a0891983b0655b669b38e7e700362c25ce4af05aaa130f000aa6a04037534a7a23a8d99454948dd689277eab321","bitcoinSignature1":"4049b7649693d92139bf3f1f41da3825d1b3dbed2884797b76fd8e1c77390d1b4f3bf76b8d890485d7555619160a2bf18d58626f2ec9a8ca1f887eba3ba130b5","bitcoinSignature2":"0d55e84fb4059bea082d443934af74dcbfd5c4c2fd54eba3ea2823114df932e7759805207f1182062f99af028aa4b62c7723a0c5b9198fe637a3d18d4d99dc70","features":"","chainHash":"43497fd7f826957108f4a30fd9cec3aeba79972084e90ead01ea330900000000","shortChannelId":"1513532x23x1","nodeId1":"034fe52e98a0e9d3c21b767e1b371881265d8c7578c21f5afd6d6438da10348b36","nodeId2":"03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134","bitcoinKey1":"028cef3ef020cfda09692afc29e38ac4756ca60736563a93220481091c9cd05b64","bitcoinKey2":"03660d280e24a9b16772a6e6418029719620a5caa29ebdf8339e5d700c611ab9e3"},"channelUpdate":{"signature":"4e34a547c424182812bd39b35c1c244b98f2bbb5b7d07812b9a008bb69f3fd77788f4ad338a102c331892afa8d076167a6a6cfb4eac3b890387f0fdc98b5b8c3","chainHash":"43497fd7f826957108f4a30fd9cec3aeba79972084e90ead01ea330900000000","shortChannelId":"1513532x23x1","timestamp":1560862173,"messageFlags":1,"channelFlags":1,"cltvExpiryDelta":144,"htlcMinimumMsat":1000,"feeBaseMsat":1000,"feeProportionalMillionths":100,"htlcMaximumMsat":16777215000}}""", - hex"00000303933884AAF1D6B108397E5EFE5C86BCF2D8CA8D2F700EDA99DB9214FC2712B1340004D443ECE9D9C43A11A19B554BAAA6AD150000000000000222000000003B9ACA0000000000000249F000000000000000010090001E800BD48A22F4C80A42CC8BB29A764DBAEFC95674931FBE9A4380000000C50134D4A745996002F219B5FDBA1E045374DF589ECA06ABE23CECAE47343E65EDCF800000000000011E80000001BA90824000000000000124F800000000000001F4038500F1810AE1AF8A1D6F56F80855E26705F191BB07CD4E2434BC5BB1698E7E5880E2266201E8BFEEEEED725775B8116F6F82CF8E87835A5B45B184E56F272AD70D6078118601E06212B8C8F2E25B73EE7974FDCDF007E389B437BBFE238CCC3F3BF7121B6C5E81AA8589D21E9584B24A11F3ABBA5DAD48D121DD63C57A69CD767119C05DA159CB81A649D8CC0E136EB8DFBD2268B69DCA86F8CE4A604235A03D9D37AE7B07FC563F80000000C080800000000000271C000000000177000000002808B14600000001970039BA00123767F0F4F00D5E9FDF24177EF2872343D9F8FAEC65D3048BA575E70E00A0AB08800000000015E070F20000000000110010584241B5FB364208F6E64A80D1166DAD866186B10C015ED0283FF1C308C2105A0023A910810AE1AF8A1D6F56F80855E26705F191BB07CD4E2434BC5BB1698E7E5880E226621081DE8ADFA110DC8A94D8B9E9EF616BAE8598287C8F82AFDF0FC068697D570266FDA95700AD81000000000080B767F0F4F00D5E9FDF24177EF2872343D9F8FAEC65D3048BA575E70E00A0AB0880000000003E7AEDC0011ABE8A00000000001100101A9CE4B6AEF469590BC7BCC51DCEEAE9C86084055A63CC01E443C733FBE400B9B5B16800000000000B000A5E5700106D1A7097E4DE87EBAF1F8F2773842FA482002418228110805E84989A81F51ABD9D11889AE43E68FAD93659DEC019F1B8C0ADBF15A57B118B81101DCC1256F9306439AD3962C043FC47A5179CAAA001CCB23342BE0E8D92E4022780A4182281108074F306DA3751B84EC5FFB155BDCA7B8E02208BBDBC8D4F3327ABA557BF27CD1701102EF4AC8CC92F469DA9642D4D4162BC545F8B34ADE15B7D6F99808AA22B086B0180A3A910810AE1AF8A1D6F56F80855E26705F191BB07CD4E2434BC5BB1698E7E5880E226621081DE8ADFA110DC8A94D8B9E9EF616BAE8598287C8F82AFDF0FC068697D570266FDA9576F8099900000000000000000271C00000000017700000001970039BA000000002808B14648CE00AE97051EE10A3C361263F81A98165CE4AA7BA076933D4266E533585F24815C15DEACF0691332B38ECF23EC39982C5C978C748374A01BA9B30D501EE4F26E8000000000000000000000000000000000001224000000000000004B800040A911C460F1467952E3B99BED072F81BFB4454FF389636DCB399FE6A78113C28580091BB3F87A7806AF4FEF920BBF794391A1ECFC7D7632E98245D2BAF3870050558440000000000AF0387900000000000880082C2120DAFD9B21047B732540688B36D6C330C3588600AF68141FF8E18461082D0011D488408570D7C50EB7AB7C042AF13382F8C8DD83E6A7121A5E2DD8B4C73F2C407113310840EF456FD0886E454A6C5CF4F7B0B5D742CC143E47C157EF87E03434BEAB81337ED4AB8001C00F40003FFFFFFFEC7200403248A1D44DFA3AC9EC237D452C936400CAA86E9517CCCF2A8F77B7493CD70B6A00780001FFFFFFFF63A0041826829646B907A97FBD1455EA8673A12B8E7AA6EA790F7802E955CE3B69DE57E006E0001FFFFFFFF640081E51EB1F91218821E680B50E4B22DF8B094385BD33ACAE36BFC9E8C2F5AD2DA5400EC0003FFFFFFFEC7801047C26AD5435658D063EBCF73A5D0EEFE73ED6B73426246E8DFB3A21D1C4C7465001900007FFFFFFFE0040B115AC58BAAA900195893EA3B2AB408D2AD348AD047E3B6CB15E599625E38608006A0001FFFFFFFF7002033C39A21A38BB61F6FB33623771A9356D8885B7C12C939C770C939EF826286C200360000FFFFFFFFB4008104EF4271064A0973B053727C3E67352D00E25CAEED944F50782449CEAE8F50960001FFFFFFFF6390DD9FC3D3C0357A7F7C905DFBCA1C8D0F67E3EBB1974C122E95D79C380282AC222B21FA0007920001295AA1FB77029F7620A90EF7AE6A6CD31E4588B93264A7ADB76152D535C52E90B9E1B7C2376DABA316A6290F1A9730D4E5E44D0B1CB0EE6A795702E6A6BCDFCDA1A4BFEBFC134AB8847A5187ECE761D75D3CCB904274875680F51984800000000AC87E8001E480002E884D2A8080804800000000000001F4000001F40000003200000001BF08EB000" -> """{"commitments":{"localParams":{"nodeId":"03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134","channelKeyPath":{"path":[3561221353,3653515793,2711311691,2863050005]},"dustLimitSatoshis":546,"maxHtlcValueInFlightMsat":1000000000,"channelReserveSatoshis":150000,"htlcMinimumMsat":1,"toSelfDelay":144,"maxAcceptedHtlcs":30,"isFunder":true,"defaultFinalScriptPubKey":"a91445e990148599176534ec9b75df92ace9263f7d3487","features":"8a"},"remoteParams":{"nodeId":"0269a94e8b32c005e4336bfb743c08a6e9beb13d940d57c479d95c8e687ccbdb9f","dustLimitSatoshis":573,"maxHtlcValueInFlightMsat":14850000000,"channelReserveSatoshis":150000,"htlcMinimumMsat":1000,"toSelfDelay":1802,"maxAcceptedHtlcs":483,"fundingPubKey":"0215c35f143adeadf010abc4ce0be323760f9a9c486978b762d31cfcb101c44cc4","revocationBasepoint":"03d17fdddddae4aeeb7022dedf059f1d0f06b4b68b6309cade4e55ae1ac0f0230c","paymentBasepoint":"03c0c4257191e5c4b6e7dcf2e9fb9be00fc713686f77fc4719987e77ee2436d8bd","delayedPaymentBasepoint":"03550b13a43d2b09649423e75774bb5a91a243bac78af4d39aece23380bb42b397","htlcBasepoint":"034c93b1981c26dd71bf7a44d16d3b950df19c94c0846b407b3a6f5cf60ff8ac7f","features":"81"},"channelFlags":1,"localCommit":{"index":20024,"spec":{"htlcs":[],"feeratePerKw":750,"toLocalMsat":1343316620,"toRemoteMsat":13656683380},"publishableTxs":{"commitTx":{"txid":"65fe0b1f079fa763448df3ab8d94b1ad7d377c061121376be90b9c0c1bb0cd43","tx":"020000000001016ecfe1e9e01abd3fbe482efde50e4687b3f1f5d8cba609174aebce1c0141561100000000007cf5db8002357d1400000000002200203539c96d5de8d2b2178f798a3b9dd5d390c1080ab4c79803c8878e67f7c801736b62d00000000000160014bcae0020da34e12fc9bd0fd75e3f1e4ee7085f490400483045022100bd09313503ea357b3a231135c87cd1f5b26cb3bd8033e371815b7e2b4af6231702203b9824adf260c8735a72c58087f88f4a2f39554003996466857c1d1b25c8044f01483045022100e9e60db46ea3709d8bff62ab7b94f71c0441177b791a9e664f574aaf7e4f9a2e02205de95919925e8d3b52c85a9a82c578a8bf16695bc2b6fadf330115445610d603014752210215c35f143adeadf010abc4ce0be323760f9a9c486978b762d31cfcb101c44cc42103bd15bf4221b91529b173d3dec2d75d0b3050f91f055fbe1f80d0d2faae04cdfb52aedf013320"},"htlcTxsAndSigs":[]}},"remoteCommit":{"index":20024,"spec":{"htlcs":[],"feeratePerKw":750,"toLocalMsat":13656683380,"toRemoteMsat":1343316620},"txid":"919c015d2e0a3dc214786c24c7f035302cb9c954f740ed267a84cdca66b0be49","remotePerCommitmentPoint":"02b82bbd59e0d22665671d9e47d8733058b92f18e906e9403753661aa03dc9e4dd"},"localChanges":{"proposed":[],"signed":[],"acked":[]},"remoteChanges":{"proposed":[],"acked":[],"signed":[]},"localNextHtlcId":9288,"remoteNextHtlcId":151,"originChannels":{},"remoteNextCommitInfo":"02a4471183c519e54b8ee66fb41cbe06fed1153fce258db72ce67f9a9e044f0a16","commitInput":{"outPoint":"115641011cceeb4a1709a6cbd8f5f1b387460ee5fd2e48be3fbd1ae0e9e1cf6e:0","amountSatoshis":15000000},"remotePerCommitmentSecrets":null,"channelId":"6ecfe1e9e01abd3fbe482efde50e4687b3f1f5d8cba609174aebce1c01415611"},"shortChannelId":"1413373x969x0","buried":true,"channelUpdate":{"signature":"52b543f6ee053eec41521def5cd4d9a63c8b117264c94f5b6ec2a5aa6b8a5d2173c36f846edb57462d4c521e352e61a9cbc89a163961dcd4f2ae05cd4d79bf9b","chainHash":"43497fd7f826957108f4a30fd9cec3aeba79972084e90ead01ea330900000000","shortChannelId":"1413373x969x0","timestamp":1561369173,"messageFlags":1,"channelFlags":1,"cltvExpiryDelta":144,"htlcMinimumMsat":1000,"feeBaseMsat":1000,"feeProportionalMillionths":100,"htlcMaximumMsat":15000000000}}""" + hex"00000303933884AAF1D6B108397E5EFE5C86BCF2D8CA8D2F700EDA99DB9214FC2712B134000456E4167E3C0EB8C856C79CA31C97C0AA0000000000000222000000012A05F2000000000000028F5C000000000000000102D0001E000BD48A2402E80B723C42EE3E42938866EC6686ABB7ABF64380000000C501A7F2974C5074E9E10DBB3F0D9B8C40932EC63ABC610FAD7EB6B21C6D081A459B000000000000011E80000001EEFFFE5C00000000000147AE00000000000001F403F000F18146779F781067ED04B4957E14F1C5623AB653039B2B1D49910240848E4E682DB20131AD64F76FAF90CD7DE26892F1BDAB82FB9E02EF6538D82FF4204B5348F02AE081A5388E9474769D69C4F60A763AE0CCDB5228A06281DE64408871A927297FDFD8818B6383985ABD4F0AC22E73791CF3A4D63C592FA2648242D34B8334B1539E823381BB1F1404C37D9C2318F5FC6B1BF7ECF5E6835B779E3BE09BADCF6DF1F51DCFBC80000000C0808000000000000EFD80000000007F00000000061A0A4880000001EDE5F3C3801203B9C79160B5123CADE575E370480B57B0C816EB35DD7B27372EDA858622EB1E808000000015FFFFFF800000000011001029DFB814F6502A68D6F83B6049E3D2948A2080084083750626532FDB437169C20023A9108146779F781067ED04B4957E14F1C5623AB653039B2B1D49910240848E4E682DB21081B30694071254D8B3B9537320C014B8CB1052E5514F5EFC19CF2EB806308D5CF1A95700AD0100000000008083B9C79160B5123CADE575E370480B57B0C816EB35DD7B27372EDA858622EB1E80800000001961B4C001618F8180000000001100102E648BA30998A28C02C2DFD9DDCD0E0BA064DA199C55186485AFAB296B94E704426FFE00000000000B000A67D9B9FAADB91650E0146B1F742E5C16006708890200239822011026A6925C659D006FEB42D639F1E42DD13224EE49AA34E71B612CF96DB66A8CD4011032C22F653C54CC5E41098227427650644266D80DED45B7387AE0FFC10E529C4680A418228110807CB47D9C1A14CB832FB361C398EA672C9542F34A90BAD4288FA6AC5FC9E9845C01101CF71CAE9252D389135D8C606225DCF1E0333CCDF1FAE84B74FC5D3D440C25F880A3A9108146779F781067ED04B4957E14F1C5623AB653039B2B1D49910240848E4E682DB21081B30694071254D8B3B9537320C014B8CB1052E5514F5EFC19CF2EB806308D5CF1A9573D7C531000000000000000000F3180000000007F00000001EDE5F3C380000000061A0A48D64CA627B243AD5915A2E5D0BAD026762028DDF3304992B83A26D6C11735FC5F01ED56D769BDE7F6A068AF1A4BCFDF950321F3A4744B01B1DDC7498677F112AE1A80000000000000000000000000000000000000658000000000000819800040D37301C10C9419287E9A3B704EB6D7F45CC145DD77DCE8A63B0A47C8AB67467D800901DCE3C8B05A891E56F2BAF1B82405ABD8640B759AEEBD939B976D42C311758F40400000000AFFFFFFC00000000008800814EFDC0A7B2815346B7C1DB024F1E94A451040042041BA83132997EDA1B8B4E10011D48840A33BCFBC0833F6825A4ABF0A78E2B11D5B2981CD958EA4C881204247273416D90840D9834A03892A6C59DCA9B990600A5C65882972A8A7AF7E0CE7975C031846AE78D4AB8002000EC0003FFFFFFFF86801076D98A575A4CDFD0E3F44D1BB3CD3BBAF3BD04C38FED439ED90D88DF932A9296801A80007FFFFFFFF4008136A9D5896669E8724C5120FB6B36C241EF3CEF68AE0316161F04A9EE3EAFF36000FC0003FFFFFFFF86780106E4B5CC4155733A2427082907338051A5DA1E7CA6432840A5528ECAFFA3FB628801B80007FFFFFFFF10020CA4E125E9126107745D4354D4187ABCDE323117857A1DCEB7CCF60B2AAFA80C6003A0000FFFFFFFFE1C0080981575FD981A73A848CC0243CB467BF451F6811DAF4D71CAD8CE8B1E96DB190C01000003FFFFFFFF867400814C747E0FD8290BE8A3B8B3F73015A261479A71780CD3A0A9270234E4B394409C00D80003FFFFFFFF90020E1B9C9B10A97F15F5E1BB27FC8AC670DF8DADEAE4EDFAFB23BDD0AC705FDF51600340000FFFFFFFFF0020AD2581F3494A17B0BE3F63516D53F028A204FD3156D8B21AA4E57A8738D2062080007FFFFFFFF0CE83B9C79160B5123CADE575E370480B57B0C816EB35DD7B27372EDA858622EB1E0B8C1E00000B8000FA46CC2C7E9AB4A37C64216CD65C944E6D73998419D1A1AD2827AB6BC85B32280230764E374064EC82A3751E789607E23BEAE93FB0EDDD5E7FA803767079662E80EAEF384E2AFCB68049D9DC246119E77BD2ED4112330760CAB6CD3671CFCE006C584B9C95E0B554261E00154D40806EA694F44751B328A9291BAD124EFD5664280936EC92D27B242737E7E3E83B4704BA367B7DA5108F2F6EDFB1C38EE721A369E77EED71B12090BAEAAAC322C1457E31AB0C4DE5D9351943F10FD747742616A1AABD09F680B37D4105A8872695EE9B97FAB8985FAA9D747D45046229BF265CEEB300A40FE23040C5F335E0515496C58EE47418B72331FCC6F47A31A9B33B8E000008692FFAFF04D2AE211E9461FB39D875D74F32E4109D21D5A03D46612000000002E307800002E0002069FCA5D3141D3A78436ECFC366E31024CBB18EAF1843EB5FADAC871B42069166C0726710955E3AD621072FCBDFCB90D79E5B1951A5EE01DB533B72429F84E2562680519DE7DE0419FB412D255F853C71588EAD94C0E6CAC7526440902123939A0B6C806CC1A501C495362CEE54DCC830052E32C414B95453D7BF0673CBAE018C23573C69C694A8F88483050257A7366B838489731E5776B6FA0F02573401176D3E7FAEEF11E95A671420586631255F51A0EC2CF4D4D9F69D587712070FE1FB9316B71868692FFAFF04D2AE211E9461FB39D875D74F32E4109D21D5A03D46612000000002E307800002E0002BA11BBBA0202012000000000000007D0000007D0000000C800000007CFFFF83000" -> """{"commitments":{"localParams":{"nodeId":"03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134","channelKeyPath":{"path":[1457788542,1007597768,1455922339,479707306]},"dustLimitSatoshis":546,"maxHtlcValueInFlightMsat":5000000000,"channelReserveSatoshis":167772,"htlcMinimumMsat":1,"toSelfDelay":720,"maxAcceptedHtlcs":30,"isFunder":false,"defaultFinalScriptPubKey":"a9144805d016e47885dc7c852710cdd8cd0d576f57ec87","features":"8a"},"remoteParams":{"nodeId":"034fe52e98a0e9d3c21b767e1b371881265d8c7578c21f5afd6d6438da10348b36","dustLimitSatoshis":573,"maxHtlcValueInFlightMsat":16609443000,"channelReserveSatoshis":167772,"htlcMinimumMsat":1000,"toSelfDelay":2016,"maxAcceptedHtlcs":483,"fundingPubKey":"028cef3ef020cfda09692afc29e38ac4756ca60736563a93220481091c9cd05b64","revocationBasepoint":"02635ac9eedf5f219afbc4d125e37b5705f73c05deca71b05fe84096a691e055c1","paymentBasepoint":"034a711d28e8ed3ad389ec14ec75c199b6a45140c503bcc88110e3524e52ffbfb1","delayedPaymentBasepoint":"0316c70730b57a9e15845ce6f239e749ac78b25f44c90485a697066962a73d0467","htlcBasepoint":"03763e280986fb384631ebf8d637efd9ebcd06b6ef3c77c1375b9edbe3ea3b9f79","features":"81"},"channelFlags":1,"localCommit":{"index":7675,"spec":{"htlcs":[],"feeratePerKw":254,"toLocalMsat":204739729,"toRemoteMsat":16572475271},"commitTxAndRemoteSig":{"commitTx":{"txid":"e25a866b79212015e01e155e530fb547abc8276869f8740a9948e52ca231f1e4","tx":"020000000107738f22c16a24795bcaebc6e09016af61902dd66bbaf64e6e5db50b0c45d63d010000000032c3698002c31f0300000000002200205cc91746133145180585bfb3bb9a1c1740c9b43338aa30c90b5f5652d729ce0884dffc0000000000160014cfb373f55b722ca1c028d63ee85cb82c00ce11127af8a620"},"remoteSig":"4d4d24b8cb3a00dfd685ac73e3c85ba26449dc935469ce36c259f2db6cd519a865845eca78a998bc8213044e84eca0c884cdb01bda8b6e70f5c1ff821ca5388d"},"htlcTxsAndRemoteSigs":[]},"remoteCommit":{"index":7779,"spec":{"htlcs":[],"feeratePerKw":254,"toLocalMsat":16572475271,"toRemoteMsat":204739729},"txid":"ac994c4f64875ab22b45cba175a04cec4051bbe660932570744dad822e6bf8be","remotePerCommitmentPoint":"03daadaed37bcfed40d15e34979fbf2a0643e748e8960363bb8e930cefe2255c35"},"localChanges":{"proposed":[],"signed":[],"acked":[]},"remoteChanges":{"proposed":[],"acked":[],"signed":[]},"localNextHtlcId":203,"remoteNextHtlcId":4147,"originChannels":{},"remoteNextCommitInfo":"034dcc0704325064a1fa68edc13adb5fd173051775df73a298ec291f22ad9d19f6","commitInput":{"outPoint":"3dd6450c0bb55d6e4ef6ba6bd62d9061af1690e0c6ebca5b79246ac1228f7307:1","amountSatoshis":16777215},"remotePerCommitmentSecrets":null,"channelId":"07738f22c16a24795bcaebc6e09016af61902dd66bbaf64e6e5db50b0c45d63c"},"shortChannelId":"1513532x23x1","buried":true,"channelAnnouncement":{"nodeSignature1":"d2366163f4d5a51be3210b66b2e4a2736b9ccc20ce8d0d69413d5b5e42d991401183b271ba032764151ba8f3c4b03f11df5749fd876eeaf3fd401bb383cb3174","nodeSignature2":"075779c27157e5b4024ecee12308cf3bde976a0891983b0655b669b38e7e700362c25ce4af05aaa130f000aa6a04037534a7a23a8d99454948dd689277eab321","bitcoinSignature1":"4049b7649693d92139bf3f1f41da3825d1b3dbed2884797b76fd8e1c77390d1b4f3bf76b8d890485d7555619160a2bf18d58626f2ec9a8ca1f887eba3ba130b5","bitcoinSignature2":"0d55e84fb4059bea082d443934af74dcbfd5c4c2fd54eba3ea2823114df932e7759805207f1182062f99af028aa4b62c7723a0c5b9198fe637a3d18d4d99dc70","features":"","chainHash":"43497fd7f826957108f4a30fd9cec3aeba79972084e90ead01ea330900000000","shortChannelId":"1513532x23x1","nodeId1":"034fe52e98a0e9d3c21b767e1b371881265d8c7578c21f5afd6d6438da10348b36","nodeId2":"03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134","bitcoinKey1":"028cef3ef020cfda09692afc29e38ac4756ca60736563a93220481091c9cd05b64","bitcoinKey2":"03660d280e24a9b16772a6e6418029719620a5caa29ebdf8339e5d700c611ab9e3"},"channelUpdate":{"signature":"4e34a547c424182812bd39b35c1c244b98f2bbb5b7d07812b9a008bb69f3fd77788f4ad338a102c331892afa8d076167a6a6cfb4eac3b890387f0fdc98b5b8c3","chainHash":"43497fd7f826957108f4a30fd9cec3aeba79972084e90ead01ea330900000000","shortChannelId":"1513532x23x1","timestamp":1560862173,"messageFlags":1,"channelFlags":1,"cltvExpiryDelta":144,"htlcMinimumMsat":1000,"feeBaseMsat":1000,"feeProportionalMillionths":100,"htlcMaximumMsat":16777215000}}""", + hex"00000303933884AAF1D6B108397E5EFE5C86BCF2D8CA8D2F700EDA99DB9214FC2712B1340004D443ECE9D9C43A11A19B554BAAA6AD150000000000000222000000003B9ACA0000000000000249F000000000000000010090001E800BD48A22F4C80A42CC8BB29A764DBAEFC95674931FBE9A4380000000C50134D4A745996002F219B5FDBA1E045374DF589ECA06ABE23CECAE47343E65EDCF800000000000011E80000001BA90824000000000000124F800000000000001F4038500F1810AE1AF8A1D6F56F80855E26705F191BB07CD4E2434BC5BB1698E7E5880E2266201E8BFEEEEED725775B8116F6F82CF8E87835A5B45B184E56F272AD70D6078118601E06212B8C8F2E25B73EE7974FDCDF007E389B437BBFE238CCC3F3BF7121B6C5E81AA8589D21E9584B24A11F3ABBA5DAD48D121DD63C57A69CD767119C05DA159CB81A649D8CC0E136EB8DFBD2268B69DCA86F8CE4A604235A03D9D37AE7B07FC563F80000000C080800000000000271C000000000177000000002808B14600000001970039BA00123767F0F4F00D5E9FDF24177EF2872343D9F8FAEC65D3048BA575E70E00A0AB08800000000015E070F20000000000110010584241B5FB364208F6E64A80D1166DAD866186B10C015ED0283FF1C308C2105A0023A910810AE1AF8A1D6F56F80855E26705F191BB07CD4E2434BC5BB1698E7E5880E226621081DE8ADFA110DC8A94D8B9E9EF616BAE8598287C8F82AFDF0FC068697D570266FDA95700AD81000000000080B767F0F4F00D5E9FDF24177EF2872343D9F8FAEC65D3048BA575E70E00A0AB0880000000003E7AEDC0011ABE8A00000000001100101A9CE4B6AEF469590BC7BCC51DCEEAE9C86084055A63CC01E443C733FBE400B9B5B16800000000000B000A5E5700106D1A7097E4DE87EBAF1F8F2773842FA482002418228110805E84989A81F51ABD9D11889AE43E68FAD93659DEC019F1B8C0ADBF15A57B118B81101DCC1256F9306439AD3962C043FC47A5179CAAA001CCB23342BE0E8D92E4022780A4182281108074F306DA3751B84EC5FFB155BDCA7B8E02208BBDBC8D4F3327ABA557BF27CD1701102EF4AC8CC92F469DA9642D4D4162BC545F8B34ADE15B7D6F99808AA22B086B0180A3A910810AE1AF8A1D6F56F80855E26705F191BB07CD4E2434BC5BB1698E7E5880E226621081DE8ADFA110DC8A94D8B9E9EF616BAE8598287C8F82AFDF0FC068697D570266FDA9576F8099900000000000000000271C00000000017700000001970039BA000000002808B14648CE00AE97051EE10A3C361263F81A98165CE4AA7BA076933D4266E533585F24815C15DEACF0691332B38ECF23EC39982C5C978C748374A01BA9B30D501EE4F26E8000000000000000000000000000000000001224000000000000004B800040A911C460F1467952E3B99BED072F81BFB4454FF389636DCB399FE6A78113C28580091BB3F87A7806AF4FEF920BBF794391A1ECFC7D7632E98245D2BAF3870050558440000000000AF0387900000000000880082C2120DAFD9B21047B732540688B36D6C330C3588600AF68141FF8E18461082D0011D488408570D7C50EB7AB7C042AF13382F8C8DD83E6A7121A5E2DD8B4C73F2C407113310840EF456FD0886E454A6C5CF4F7B0B5D742CC143E47C157EF87E03434BEAB81337ED4AB8001C00F40003FFFFFFFEC7200403248A1D44DFA3AC9EC237D452C936400CAA86E9517CCCF2A8F77B7493CD70B6A00780001FFFFFFFF63A0041826829646B907A97FBD1455EA8673A12B8E7AA6EA790F7802E955CE3B69DE57E006E0001FFFFFFFF640081E51EB1F91218821E680B50E4B22DF8B094385BD33ACAE36BFC9E8C2F5AD2DA5400EC0003FFFFFFFEC7801047C26AD5435658D063EBCF73A5D0EEFE73ED6B73426246E8DFB3A21D1C4C7465001900007FFFFFFFE0040B115AC58BAAA900195893EA3B2AB408D2AD348AD047E3B6CB15E599625E38608006A0001FFFFFFFF7002033C39A21A38BB61F6FB33623771A9356D8885B7C12C939C770C939EF826286C200360000FFFFFFFFB4008104EF4271064A0973B053727C3E67352D00E25CAEED944F50782449CEAE8F50960001FFFFFFFF6390DD9FC3D3C0357A7F7C905DFBCA1C8D0F67E3EBB1974C122E95D79C380282AC222B21FA0007920001295AA1FB77029F7620A90EF7AE6A6CD31E4588B93264A7ADB76152D535C52E90B9E1B7C2376DABA316A6290F1A9730D4E5E44D0B1CB0EE6A795702E6A6BCDFCDA1A4BFEBFC134AB8847A5187ECE761D75D3CCB904274875680F51984800000000AC87E8001E480002E884D2A8080804800000000000001F4000001F40000003200000001BF08EB000" -> """{"commitments":{"localParams":{"nodeId":"03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134","channelKeyPath":{"path":[3561221353,3653515793,2711311691,2863050005]},"dustLimitSatoshis":546,"maxHtlcValueInFlightMsat":1000000000,"channelReserveSatoshis":150000,"htlcMinimumMsat":1,"toSelfDelay":144,"maxAcceptedHtlcs":30,"isFunder":true,"defaultFinalScriptPubKey":"a91445e990148599176534ec9b75df92ace9263f7d3487","features":"8a"},"remoteParams":{"nodeId":"0269a94e8b32c005e4336bfb743c08a6e9beb13d940d57c479d95c8e687ccbdb9f","dustLimitSatoshis":573,"maxHtlcValueInFlightMsat":14850000000,"channelReserveSatoshis":150000,"htlcMinimumMsat":1000,"toSelfDelay":1802,"maxAcceptedHtlcs":483,"fundingPubKey":"0215c35f143adeadf010abc4ce0be323760f9a9c486978b762d31cfcb101c44cc4","revocationBasepoint":"03d17fdddddae4aeeb7022dedf059f1d0f06b4b68b6309cade4e55ae1ac0f0230c","paymentBasepoint":"03c0c4257191e5c4b6e7dcf2e9fb9be00fc713686f77fc4719987e77ee2436d8bd","delayedPaymentBasepoint":"03550b13a43d2b09649423e75774bb5a91a243bac78af4d39aece23380bb42b397","htlcBasepoint":"034c93b1981c26dd71bf7a44d16d3b950df19c94c0846b407b3a6f5cf60ff8ac7f","features":"81"},"channelFlags":1,"localCommit":{"index":20024,"spec":{"htlcs":[],"feeratePerKw":750,"toLocalMsat":1343316620,"toRemoteMsat":13656683380},"commitTxAndRemoteSig":{"commitTx":{"txid":"65fe0b1f079fa763448df3ab8d94b1ad7d377c061121376be90b9c0c1bb0cd43","tx":"02000000016ecfe1e9e01abd3fbe482efde50e4687b3f1f5d8cba609174aebce1c0141561100000000007cf5db8002357d1400000000002200203539c96d5de8d2b2178f798a3b9dd5d390c1080ab4c79803c8878e67f7c801736b62d00000000000160014bcae0020da34e12fc9bd0fd75e3f1e4ee7085f49df013320"},"remoteSig":"bd09313503ea357b3a231135c87cd1f5b26cb3bd8033e371815b7e2b4af623173b9824adf260c8735a72c58087f88f4a2f39554003996466857c1d1b25c8044f"},"htlcTxsAndRemoteSigs":[]},"remoteCommit":{"index":20024,"spec":{"htlcs":[],"feeratePerKw":750,"toLocalMsat":13656683380,"toRemoteMsat":1343316620},"txid":"919c015d2e0a3dc214786c24c7f035302cb9c954f740ed267a84cdca66b0be49","remotePerCommitmentPoint":"02b82bbd59e0d22665671d9e47d8733058b92f18e906e9403753661aa03dc9e4dd"},"localChanges":{"proposed":[],"signed":[],"acked":[]},"remoteChanges":{"proposed":[],"acked":[],"signed":[]},"localNextHtlcId":9288,"remoteNextHtlcId":151,"originChannels":{},"remoteNextCommitInfo":"02a4471183c519e54b8ee66fb41cbe06fed1153fce258db72ce67f9a9e044f0a16","commitInput":{"outPoint":"115641011cceeb4a1709a6cbd8f5f1b387460ee5fd2e48be3fbd1ae0e9e1cf6e:0","amountSatoshis":15000000},"remotePerCommitmentSecrets":null,"channelId":"6ecfe1e9e01abd3fbe482efde50e4687b3f1f5d8cba609174aebce1c01415611"},"shortChannelId":"1413373x969x0","buried":true,"channelUpdate":{"signature":"52b543f6ee053eec41521def5cd4d9a63c8b117264c94f5b6ec2a5aa6b8a5d2173c36f846edb57462d4c521e352e61a9cbc89a163961dcd4f2ae05cd4d79bf9b","chainHash":"43497fd7f826957108f4a30fd9cec3aeba79972084e90ead01ea330900000000","shortChannelId":"1413373x969x0","timestamp":1561369173,"messageFlags":1,"channelFlags":1,"cltvExpiryDelta":144,"htlcMinimumMsat":1000,"feeBaseMsat":1000,"feeProportionalMillionths":100,"htlcMaximumMsat":15000000000}}""" ) refs.foreach { case (oldbin, refjson) => @@ -172,7 +171,6 @@ class ChannelCodecsSpec extends AnyFunSuite { .replace(""""features":{"activated":{"option_data_loss_protect":{},"initial_routing_sync":{},"gossip_queries":{}},"unknown":[]}""", """"features":"8a"""") .replace(""""features":{"activated":{"option_data_loss_protect":{},"gossip_queries":{}},"unknown":[]}""", """"features":"81"""") .replace(""""features":{"activated":{},"unknown":[]}""", """"features":""""") - assert(oldjson === refjson) assert(newjson === refjson) } @@ -196,7 +194,7 @@ class ChannelCodecsSpec extends AnyFunSuite { // and we encode with the new codec val newBin = stateDataCodec.encode(decoded1).require.bytes // make sure that encoding used the new codec - assert(newBin.startsWith(hex"0200")) + assert(newBin.startsWith(hex"0300")) // make sure that round-trip yields the same data val decoded2 = stateDataCodec.decode(newBin.bits).require.value assert(decoded1 === decoded2) @@ -209,8 +207,8 @@ class ChannelCodecsSpec extends AnyFunSuite { negotiating.closingTxProposed.flatten.foreach(tx => assert(tx.unsignedTx.toLocalOutput === None)) val normal = stateDataCodec.decode(dataNormal.bits).require.value.asInstanceOf[DATA_NORMAL] - assert(normal.commitments.localCommit.publishableTxs.htlcTxsAndSigs.nonEmpty) - normal.commitments.localCommit.publishableTxs.htlcTxsAndSigs.foreach(tx => assert(tx.txinfo.htlcId === 0)) + assert(normal.commitments.localCommit.htlcTxsAndRemoteSigs.nonEmpty) + normal.commitments.localCommit.htlcTxsAndRemoteSigs.foreach(tx => assert(tx.htlcTx.htlcId === 0)) val closingLocal = stateDataCodec.decode(dataClosingLocal.bits).require.value.asInstanceOf[DATA_CLOSING] assert(closingLocal.localCommitPublished.nonEmpty) @@ -234,6 +232,39 @@ class ChannelCodecsSpec extends AnyFunSuite { assert(closingRevoked.revokedCommitPublished.head.irrevocablySpent.isEmpty) } + test("verify that we don't store local sigs for local commitment") { + val oldbins = List( + hex"00000103933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134000400633f73979e2e7cc9a76f2dbcccf4d9000000000000022200000002540be40000000000000003e800000000000000010090001e000bd48a6ca0842ad7ec52d29f4be4c7015ea447e435e5404380000000c5019a59a1964d2e91fa2ae22c629bd57e7458b98373a3503a6b3675778cc09c3298000000000000011e8000000002f34f6000000000000001f400000000000001f4004800f18145c7b7b7586534692bb0520ce003ebf3a611147729a240217370358f5712a72f01df72613647456031c11cf28c90e06230848223b1064616b89bb2e8d2557c631f011d20840603112fa5faaa4053f09f9f50bcdf94f392941569ce09310340dc50020117810d980eb608cae903683abfc8438fef5421397e688d8c4aa3a47e0fc3418601b035c2fabbe71271d3a07be023eae63e4ac5272bd09a6b990a5409160f3ab28a000000008400800000000000000000000000186a00000000000000000000000002faf08000124e7f7ef1634dc24da6981ce7b05c6afdaae490a8229d2d947a6e7e5861d76463800000000015d04300800000000011001070d0d1c4bd6ad8c9b7bcb36f6308b955dc28e4970b43991232fe217bf4a56deb0023a9108106cda8faa263d0e030d33025d6ebce83453f083c77035009f0bd1ce09e598179108145c7b7b7586534692bb0520ce003ebf3a611147729a240217370358f5712a72f2957009801000000000080ce7f7ef1634dc24da6981ce7b05c6afdaae490a8229d2d947a6e7e5861d7646380000000004e14ca4000a3318080000000000b000a0b0517d7dabd6f2da1a5bfef97681bd4958a94018200241822811080579dbcb14b3d3f2c7200693391d43977881357806ebd47b2633d0c1b5ac1a56481103c3a8f6a5e15cab0144f99ec5f875fabbdf32ef6748326f4a5b3a1b29b8c7f9e80a418228110806b4c99af1b3c8f74bef604336f1a1200a754f1680923a511f7af92391bac39ab811019085fba36cec85b5537807d07f2931858413a56c47b2cf7753fbcf4cc7206bc80a3a9108106cda8faa263d0e030d33025d6ebce83453f083c77035009f0bd1ce09e598179108145c7b7b7586534692bb0520ce003ebf3a611147729a240217370358f5712a72f2957435cc1100000000000000000000000000000186a0000000002faf08000000000000000005fbb84fad0781822e1268df19eb42468a5041d0b44dc8c7a21aa7aae19409bab81e514d9069fc6064c17f35d1d0f227fbe1b74ca89fec6c67b9668fe96341d43e200000000000000000000000000000000000000000000000000000000000040ee389313797b7f5177522d46afba5c43e37edebee6598c72e5a94c81fcc50a840009273fbf78b1a6e126d34c0e73d82e357ed5724854114e96ca3d373f2c30ebb231c0000000000ae821804000000000088008386868e25eb56c64dbde59b7b1845caaee14724b85a1cc89197f10bdfa52b6f58011d488408366d47d5131e87018699812eb75e741a29f841e3b81a804f85e8e704f2cc0bc8840a2e3dbdbac329a3495d829067001f5f9d3088a3b94d12010b9b81ac7ab89539794ab8000139fdfbc58d3709369a60739ec171abf6ab9242a08a74b651e9b9f961875d918ece7f7ef1634dc24da6981ce7b05c6afdaae490a8229d2d947a6e7e5861d76463cc80398ba555ae3310a427fe5a79299e970d0b199fdade631246d123ea6324e58f40736fc2307f587e516761e35b11c3d960991f1d905d523ff0cbdd88d527790", + hex"000002010000000103933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b1340009c5b105f42a2aea346cf8759f7c78135158b93878faac0659b26f723cc549fded80000000000000000000022200000004a817c8000000000000028f5c000000000000000102d0001e000b000a490f9af5166835d37b0f2155fa3a7a2b4fae66fd8000000105450189fed9a69c67c55d9743b3dde05b031088442ad94e9e3437e15f479f5cd66a7e000000000000011e80000001eefffe5c00000000000147ae00000000000001f403f000f18162eadafb948e88e02967005ef0da28be984f95b9fcce3cc7e1f1994d90af198c8179a7ba86216d011a9c1c49684578a6e0ca111279e6641404dee194eabcbbd21c81aaa1f3d35df2711a08374da8278fe259f6085189cc539a144c1aa0744b23495601331777d0354951fa354a8a2ee70e2bf40c9bb3f4fe340c9dab02bba5b6bb1aa00158bc5a03c0c79b947e5ac70f76f600c7fab8561e244f1425935fc51ffbe330380000000181515080800000000000000000000000007e800000000000000000000001f3fffe0c00121c2ba37173c23b01a1781e65cdf373e97395526f9e855164dac95c37502e9af3800000000015ffffff80000000001100101621d570811311537fddef81ee6f7023e2d17c11d32a53f472887dd035a78a518023a9108162eadafb948e88e02967005ef0da28be984f95b9fcce3cc7e1f1994d90af198c908181c230fcd426eee78d0fc56fa125155292858d5856a9a82ebfd6729d0db8664ea9570097010000000000809c2ba37173c23b01a1781e65cdf373e97395526f9e855164dac95c37502e9af380000000005657b04000a47fff80000000000b000a66e6e46b946f3259039de2840809a4b340aa510e8200239822011030949de6ac0462e1b5a42ded6c7763779d9f6aab069cb3366a3ca330bd1fe52b81101564903650deeb2a1f719865742e99ea0986774184727607a69bfff9f552a45a00a398220110228710b1083bde27eeb793ad155142cb69655ad8424eeae2044808edc631840d8110225098637d7f91c20e00d4a82a56520ad3cead728dd5b82b0bdcfe40d4b6acfb00a3a9108162eadafb948e88e02967005ef0da28be984f95b9fcce3cc7e1f1994d90af198c908181c230fcd426eee78d0fc56fa125155292858d5856a9a82ebfd6729d0db8664ea95773ad9b100000000000000000000000000000007e80000001f3fffe0c000000000000000063aa3a9e7e5e45c265ae8bf12e96a239ddbae4224c6f4560e149cce8a2675b208178d03c15e7303b3415e3549606ecab96ff5250ce38b2052b0a9dd2ed0af5ee75800000000000000000000000000000000000000000000000000000000000409cb1d9e3463cd48a65e9a2fa95f0755e924dba3664026d3682892bbf9527396bc0090e15d1b8b9e11d80d0bc0f32e6f9b9f4b9caa937cf42a8b26d64ae1ba8174d79c0000000000affffffc0000000000880080b10eab8408988a9bfeef7c0f737b811f168be08e99529fa39443ee81ad3c528c011d48840b1756d7dca47447014b3802f786d145f4c27cadcfe671e63f0f8cca6c8578cc64840c0e1187e6a137773c687e2b7d0928aa94942c6ac2b54d4175feb394e86dc332754ab8000070ae8dc5cf08ec0685e0799737cdcfa5ce5549be7a1545936b2570dd40ba6bce32de50000008000070ae8dc5cf08ec0685e0799737cdcfa5ce5549be7a1545936b2570dd40ba6bce0656b85b7c0e2dd09a620e28ddf865c6197074354c922bb9b76fb27ffe7fbf19cc0", + hex"00000203933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b13400041507665ff588dba1b9d4949e739ad05b0000000000000222000000003b9aca00000000000002718000000000000000010090001e000bd48a65a1ef54e50a013d73e46815abed7672835c83f34380000000c101d9ed460a901187b39b2c00d859f885104116abf778bf31c369342e4147db56e4800000000000011e80000001d87278e000000000000138c000000000000001f403c200f1811e1179456c73d778f073e17544813b4499e5053f9c8ac8f9fb1f0eb37f45ca4701e06722e502349a2857e99bf9299fe781a343aebce7557c0c3738e20f14b9e96f81985a99219fd30dcdf40438cc4d01d6027087f65d6dea4e0cd9864016febcbcbf8176c51f0ee44572f83a8a02f50053ed3cfcedbf5ce6c70f70970f5784c0bb0dfe0195a18fc266e7e7f1dabcc5234f493620de9f8e8d5932de3e8a44626974e0dd1080000000c100000000000000000000000005b8d8000000000000000000000001dd3826e0001208e981c8344120b2dce21aadce8a1ad9eb0123a574d898931d3d1449a33966f10080000000158c2b7a00000000001100101395ec5380c9641495ac8c4bb01605cf6ac58ee89a33da93d5eb09ab4be0e0ab8023a910811e1179456c73d778f073e17544813b4499e5053f9c8ac8f9fb1f0eb37f45ca471081ab89c14b9f60439db334231eff8706a1374282cf18444622420b7556a424830da95700980100000000008088e981c8344120b2dce21aadce8a1ad9eb0123a574d898931d3d1449a33966f100800000003eb8c1c0008006f600000000000b000a0eb37e79f65de8a4ca4df80979505338bcea6e76020024182281108070acce2513bf0df155ec51404333ac0397b6015bff2d87120d51d8dbf0b0f698811013a616842936434a093f8e9f85cbccb846ec2e0c49c9b541d46563cfb181886b00a418228110807ab650f61af7ce294df5a26e8cc1abb3658f0201c0cb9a2484e43fb9e61622d081102767e9f7608de2330774556121ddbd48c7a45d9598e38c821a3d9846c37e75f580a3a910811e1179456c73d778f073e17544813b4499e5053f9c8ac8f9fb1f0eb37f45ca471081ab89c14b9f60439db334231eff8706a1374282cf18444622420b7556a424830da957360f66900000000000000000000000000005b8d800000001dd3826e000000000000000005ef1d8da098d1f363033e64f2272a12b638bd3fe501c829d8350e8f3fc1c6b1481f12f3b5425786f43870f00174ddd36710d1864bbcf24aa54694cb183b43ebcbf000000000000000000000000000000000000000000000000000000000000408200a48c21439ebc4d7c70b310000bef69e454f808dee73be19aa960d54cac8100090474c0e41a2090596e710d56e7450d6cf58091d2ba6c4c498e9e8a24d19cb37880400000000ac615bd000000000008800809caf629c064b20a4ad64625d80b02e7b562c7744d19ed49eaf584d5a5f07055c011d488408f08bca2b639ebbc7839f0baa2409da24cf2829fce45647cfd8f8759bfa2e5238840d5c4e0a5cfb021ced99a118f7fc383509ba141678c2223112105baab52124186d4ab8000023a60720d10482cb73886ab73a286b67ac048e95d362624c74f451268ce59bc62b21ec0008d8000223a60720d10482cb73886ab73a286b67ac048e95d362624c74f451268ce59bc6049c6fe56892029844393a0afbf8c2c19088f565e80764b75a7e0591b97c1108ac0", + hex"00000303933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134000401196cdf9d64977c6e5c6d76f94073d40000000000000222000000003b9aca0000000000000186a000000000000000010090001e000bd48a41a38f359dc4f53b01b2451e6b4553591b51b7a6c380000000c50181b4017fa7b5999a1e4efd65e3c1001ed52dc73112da9079642887cec1130fb90000000000000111000000001dcd6500000000000000c35000000000000000008048000f01b0c14e11c47802a9a45870d78dbfc1e755dc4d0fd066e00e7bcd7cbff0501572013cd68aefa84235f941b1cc4422ba91584a3f7c9fe6a6d9492a52b362e99c0fa3819f878819a1371845cf9c5c1c54a8e5a1c29b6f5c0eb49fffb54b7aee3cbfd555017e63ed9055db05f97f98616698949cc24314aafbca12b30d3673838524e0c2d5810fdd210f2c5ab5b8eb10bd7941e7cec8e10fe9b52f4da97b3f756db0553533db80000000c40000000000000000010000000550ab8000000000000000000000012a05f20000126ad11d64ce0a200074b523772cb2b83d47d5eda3fe926c19dcbcb25d7f711839000000000015c04b4c000000000011001013fd448842ba6c09e16a187427a270fd178c1fcea81af2dfaea0d0f9067727828023a91081b0c14e11c47802a9a45870d78dbfc1e755dc4d0fd066e00e7bcd7cbff05015721081b2bc10ec17c41c96579defc91739a70d6e160f4c8de10b71e60009ba07b250672957009781000000000080ead11d64ce0a200074b523772cb2b83d47d5eda3fe926c19dcbcb25d7f711839000000000024633e4000a0724800000000000b000a7ec7110a639e4df6602c902e085a50108d476d84820023982201103d382d7ac3c00b9e107740b34282f2665ea6813fda6ba643e1022078b9077658011037c4bdf8a6b68e3687cdeb650f2ff34ca1565c72452f74b202c9ae21f33f73dc00a4182281108064d376fce0d1822264ba099d0e1f23ae65a81ee3144564a18b6a9ea9c3cfe90e0110102f070312d5df2d4a056dd6ec167eecd49ee73d1b527acad4047c28855119d800a3a91081b0c14e11c47802a9a45870d78dbfc1e755dc4d0fd066e00e7bcd7cbff05015721081b2bc10ec17c41c96579defc91739a70d6e160f4c8de10b71e60009ba07b25067295760bdec10000000000000000000010000000550ab800000012a05f20000000000000000007a3685b682b628b7367b527481625a0b9b077f6bd79f2da1fb8325178997687801e292ae688fa3c2feca83618455ecdc13160c036ed8fa20df163afd443605630b0000000000000000000000000000000000000000000000000000000000004084a794a9140b8bff733dd25153972802ac0aa1a1f9970c5513a13f2c4b84fd57400935688eb2670510003a5a91bb96595c1ea3eaf6d1ff49360cee5e592ebfb88c1c80000000000ae025a6000000000008800809fea244215d3604f0b50c3a13d1387e8bc60fe7540d796fd750687c833b93c14011d48840d860a708e23c0154d22c386bc6dfe0f3aaee2687e83370073de6be5ff8280ab90840d95e08760be20e4b2bcef7e48b9cd386b70b07a646f085b8f30004dd03d9283394ab8000400fc0003fffffffffff8010698cb8b8fdeef64d356179b432c40a5a3abba23d07fca70137f2e10c9972c92cc0003fffffffffffb5688eb2670510003a5a91bb96595c1ea3eaf6d1ff49360cee5e592ebfb88c1c84efa9800019800023ae764af5c1229787c57b6ccafa9e8ca2e8bcb1a4eac39b202194a89987c86f606bd1004e9f5eac0c223530a1b9fee435a1c5bc2d8f849940273e0a6dd4a8cd343497fd7f826957108f4a30fd9cec3aeba79972084e90ead01ea33090000000013bea600006600005b307a3d000100900000000000000001000003e8000000640", + hex"000005010000000003933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b13400045d37887e8d909085b00af1d8b09c514b000000000000022200000004a817c8000000000000000b18000000000000000102d0001e000bd48a3d3ca19286d69a373eb6dda039da0cccf0bb6330c380000000c501df7e8244b99cc46d750bcef5830755886bad20416438b5973b3c8174f9d85b93000000000000011e80000000086131ec000000000000058c00000000000001f4004800f1817ce5a3cfc79898018c8d4489a393b1a46f6890a79a56737f867bfa56c511aa388107f85642fedecfcb7ef3cea6b38e26aead2759263d123692fd0c7d458fbc188881580b52cf6cdb449abc060bce9db3f35eebec2c87b316fd7a2c3193296d4a6e2e81fd2e032dd33ba9fa974246fccfc3ab5ccc1eb9ede9c900fc4e5d455c42150b3a8113237ef34839fc8055cbb63c0b9892defe6554c9dc70813681c2f3f35dedc13300000000c08080000000000000000000000010de8000000000000000000000000876dccc00125f6d0ab2880e92007f31c38dc0a8460c95a4c15291a24c92af1bca9264d8a915808000000015b7aa82000000000011001004a9c0705b42fa733f200639ed816601f0f413b9f29616f9c23f02f0dfc1df7e0023a910810115b6a5e11518dc1598fbc803018f3d87edac78de6e5544ff868bacb803485c10817ce5a3cfc79898018c8d4489a393b1a46f6890a79a56737f867bfa56c511aa38a957009781000000000080df6d0ab2880e92007f31c38dc0a8460c95a4c15291a24c92af1bca9264d8a91580800000003df2714000811e8200000000000b000a11e33689533b2499781f9b2f9c1893add8c57c4e02002418228110806567eeed21d6e87a045f3debf5ca10a05339c25f021400d96f7b492a957a94d301101df62a1c365062cce3b9a3ef530a4cd37eae4346491ed37e050dfd54213ef54f00a3982201103484562bcbb22ae3d892808bb04ff25f309a4732474a57bf6dd7691e17fc3df6811006854f362bcec61184d4721dfd30f777485be3580cd116564d139668bb6ee3a280a3a910810115b6a5e11518dc1598fbc803018f3d87edac78de6e5544ff868bacb803485c10817ce5a3cfc79898018c8d4489a393b1a46f6890a79a56737f867bfa56c511aa38a9573b51e910000000000000000000000000000010de800000000876dccc000000000000000025f43cb5a86018845618974486d0cb225355649b88690a914ee6cfec1a75286481d9daff2fcb7edb8d99f8fab9f77ff1033d5fc33a42ea7f8b70d29614b6d3195d000000000000000000000000000000000000000000000000000000000000409799acc6bbef72e7bc3dbed7831ac4e4ecfdad169d19628429edaa495d3c79ef00092fb68559440749003f98e1c6e05423064ad260a948d12649578de549326c548ac0400000000adbd54100000000000880080254e0382da17d399f90031cf6c0b300f87a09dcf94b0b7ce11f81786fe0efbf0011d48840808adb52f08a8c6e0acc7de40180c79ec3f6d63c6f372aa27fc345d65c01a42e0840be72d1e7e3cc4c00c646a244d1c9d8d237b44853cd2b39bfc33dfd2b6288d51c54ab800017db42aca203a4801fcc70e3702a118325693054a4689324abc6f2a499362a4557db42aca203a4801fcc70e3702a118325693054a4689324abc6f2a499362a454002f5228f4f2864a1b5a68dcfadb7680e7683333c2ed8cc30f7db42aca203a4801fcc70e3702a118325693054a4689324abc6f2a499362a454002c0028c95c468f1c569d43c9af6d335b8820bdda4888fe000200000", + hex"00000503933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134000454699830eddf332655e0ff86e6c536f30000000000000222000000003b9aca0000000000000186a000000000000000010090001e000bd48a482e9d4f3df4621c059bdf7df20f5ec9c4df26364380000000c101bf0694efa44b50d2817c3ac271bd38ad5110d72162deb6328cc919097ed7727f8000000000000111000000001dcd6500000000000000c35000000000000000008048000f01f7f51dd8abfc590feb6569d6f656b2a6205f339ec297e7c90239bf40aa432e9d01125974b8fc60d0122160b22db09edf15265c9f8d42c407a4b6e286445ce2897e01c8dfdd96184b8a8a0faa4d5d92acea243bb257e2bf911767efbf3e0fee216d3b81f4207be48f4ebbc397fb0bf3d223696ce431919a583ad69a7f3825323977b38a811b7e73e5b685f78f56e8d250e68d99452deed356a826fb5f207d314d0b61b97780000000c50000000000000000000000000001770000000000000000000000012a05f20000121a8b778cb9a0d244c835acbedbfc43713175d98e2d1a48316af9b751f4c75686800000000015c04b4c000000000011001029e7f0fe79b14835816eb3cb89338bf442f040ee84ea6fdfb401ac2aac96919a0023a91081eabde40c6773291d64bb71962995d7fd3401470b2e53a320331df956212b0c171081f7f51dd8abfc590feb6569d6f656b2a6205f339ec297e7c90239bf40aa432e9d29570097810000000000809a8b778cb9a0d244c835acbedbfc43713175d98e2d1a48316af9b751f4c7568680000000003b78dfc000b0ca4c00000000000b000a62d6449887f18b11f7c38a7d73a58620a23bda4682002418228110805b5b0d8c18572b99a6496d58eefe9bc20bcf359d91cc480c022591ba7c86d2280110096244c4df48199bd71b654c29ac49aa2a1dfcb6f2554a89b7d38bd28de98f6200a39822011013d445ecdc92ced0ebe8920580d3e5e7a1cdfd19fd39a5e57495a80e8a7cc0630110163a3f38ba3f23acc687ac397fb98d8dedb9a07a4085dec28d5a792e9ea2aece00a3a91081eabde40c6773291d64bb71962995d7fd3401470b2e53a320331df956212b0c171081f7f51dd8abfc590feb6569d6f656b2a6205f339ec297e7c90239bf40aa432e9d29570cf71b1000000000000000000000000000000177000000012a05f200000000000000000054e507323b7ab08f00c834e2ba694233f9d50293312291fc893691e512805f45814c861ee65261b9b7bdaaaebd59d316e5bf00417c2c9afeb5db143096feff164480000000000000000000000000000000000000000000000000000000000040b625f1f1e5239ce80103faf7851d4adbfbed7cf5bace51b959d5d6050f88e65d40090d45bbc65cd06922641ad65f6dfe21b898baecc7168d2418b57cdba8fa63ab4340000000000ae025a6000000000008800814f3f87f3cd8a41ac0b759e5c499c5fa21782077427537efda00d615564b48cd0011d48840f55ef20633b9948eb25db8cb14caebfe9a00a3859729d190198efcab1095860b8840fbfa8eec55fe2c87f5b2b4eb7b2b5953102f99cf614bf3e4811cdfa05521974e94ab800006a2dde32e683491320d6b2fb6ff10dc4c5d76638b46920c5abe6dd47d31d5a1a6a2dde32e683491320d6b2fb6ff10dc4c5d76638b46920c5abe6dd47d31d5a1a002f522920ba753cf7d18870166f7df7c83d7b27137c98d90e6a2dde32e683491320d6b2fb6ff10dc4c5d76638b46920c5abe6dd47d31d5a1a002f522994760b5d8d708a41fe54bdd87888baf41f10e7bd0e000200000", + hex"00000603933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b1340004004c3bfd866d20986aa90ec265fdfcbe0000000000000222000000012a05f20000000000000186a000000000000000010090001e000bd48a3b48ca7482f0442970651ba40bf45091fddef3a84380000000c501a0528fcd6c721246634deb024236eb2f4c124e13b587093a6652e7bfc12db3250000000000000111000000009502f900000000000000c350000000000000000083f0000f01210cce90e63d17d62e20b45b61b1add86631f6a5c90328c19fc1caf8085e600e0110d8d9aa7be8b4553b0af05b921c72c48356c4a0af61ffed7f1eadb7c5071c64816bf131172fe61d3145d39511755ee8095927534b76c4bb2464b706eaaee1486e01dd6caa8417804e26ce56f83a2525aa05fba25d3bab6db2cae5a203ce126da1ec01c8dfca1943df0dd0d59ffda66e207316c4af1cd3a4b6443fc5298a7a3864658f00000001404500000000000000001400000000017700000000015b95aa0000000128aa5c560012338c4e025330542050c2387b69ebb64e9c884113bb1045e996ae73e2b1b00a45800000000015c04b4c00000000001100104c97a415e599a3817965ff9a64e87d2af9bbcd77cae148ea934f9488216ffee10023a91081210cce90e63d17d62e20b45b61b1add86631f6a5c90328c19fc1caf8085e600e10814be9ac4ddf6ef583cde6ca4aea965a3f51028afcb1280f86f0ad47a533149d08a95700ad01000000000080b38c4e025330542050c2387b69ebb64e9c884113bb1045e996ae73e2b1b00a4580000000003eef56c0017b588000000000001100100783bea5072cc7b3be1475a5a8d7c45f16978bbc8b914937c89631a4e7f0d7e3b5714b80000000000b000a0c933f5731198ebb4e0fda5b7ba130c1c4d2fc870200239822011032e32cd21310cf1864c862bb32b9c78b1b8a626d1094d47d0e1938166388243f81101bbf4ba992687498419d57da8e6d700809fdf1f882425296292ff55b67ec82bd80a4182281108054815d830690f798ccd75722576882f62a088d37e81cde50c40bc5b080615c3e011030965e18229cbf3a03024a97988d75cb1b1569eaa1ce381d0689958161c4799900a3a91081210cce90e63d17d62e20b45b61b1add86631f6a5c90328c19fc1caf8085e600e10814be9ac4ddf6ef583cde6ca4aea965a3f51028afcb1280f86f0ad47a533149d08a9571b2c3e90000000000000000000140000000001770000000128aa5c5600000000015b95aa392494f078bec5b681d4997f2497d52112ad54eaaa81dec63f6480336139048b81fc2e019907aefb5efc5922187f575e10635611bde69ae0bd46b0b6ea44aea7748000000000000000000000000000000000000000000000000000000a000040f7dd9de11426234d0121ec1f5d2d19c3b4e78679b2e07a5c4f91bc624458352bc00919c6270129982a1028611c3db4f5db274e442089dd8822f4cb5739f158d80522c0000000000ae025a60000000000088008264bd20af2ccd1c0bcb2ffcd32743e957cdde6bbe570a47549a7ca4410b7ff708011d4884090866748731e8beb17105a2db0d8d6ec3318fb52e4819460cfe0e57c042f30070840a5f4d626efb77ac1e6f36525754b2d1fa881457e589407c37856a3d2998a4e8454ab8000800ec0003ffffffffff80106b5a98105912cee7f3cd2a4ed131283ee6fa4f5aef2e74aec08ebc2d6770ee38001e80007fffffffffec0082e868d9d8ebcc94bff771ca9d328bccfdfafdbc17e2b078b728caa0bb7179c6420001ffffffffffb0ce3138094cc150814308e1eda7aed93a7221044eec4117a65ab9cf8ac6c02916000200e60400000002ce3138094cc150814308e1eda7aed93a7221044eec4117a65ab9cf8ac6c029160000000001fffffffe05ed620000000000002f5228ed2329d20bc110a5c1946e902fd14247f77bcea10f17c52e00000000002f52295b2c2f65d18b177c1a91981b0335c8d209f93ea10e000000000002029e04000000000202ce3138094cc150814308e1eda7aed93a7221044eec4117a65ab9cf8ac6c029160000000001fffffffe05ed620000000000002f5228ed2329d20bc110a5c1946e902fd14247f77bcea10f17c52e00000000002f52295b2c2f65d18b177c1a91981b0335c8d209f93ea10e08008e608804401c9f21ea6ff52325709bc8fec460de1d9f584cbf6aced6abeda5842595fbb968044076a3a4b918db66a59ee47c4d3a2f8bb0f17665e6d904df5cab74ee06cbafbb3e028e60880440b6af6af4787b1229039a7351f7156d0cc30755a1902c6d483ea85915a29b40f6044023ea5be6088489f6dda062498c485465c7451d7bf49eb46dae206bf952ddc860028ea4420484333a4398f45f58b882d16d86c6b76198c7da97240ca3067f072be02179803842052fa6b1377dbbd60f379b292baa5968fd440a2bf2c4a03e1bc2b51e94cc527422a55c0000000000000", + hex"000008010000000003933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b1340004515822333393159ec64e3694540844cd000000000000022200000004a817c80000000000000003e8000000000000000102d0001e000bd48a04a8223d31a871ecced64af1c4690532d4b5de984380000000c5012e53ad31acde84a88f55e981f2c33e8d6b451e15463d3da9335dbe9e30a474c60000000000000111000000009502f90000000000000001f400000000000000008168000f01e35c520b80e355ee4ca8a1964a439e7d64fd2e1ddd6c10af140096471093a46c0126a65afe85868caba0a468ae6adf48b02e3dbd527a7d6e86c8b6426af06a5cce81ece00b5452805039314df65a98f5eeb21eab3d917853cf49567c28392e094806012f5f8f9177f320504b51ee8112a62fb5c505b8d9167737731545d99141d3485501004c1a5ece2ff034dcc63ec008df0ec8185934a2fcaf3075a75a5a999989d96580000000c50080000000000000000000000057e400000000000000000000000002faf08000125d32c79d17913addb93e6c7b952be8c2f93718867c1e39098daa4b85fc56a26c800000000015d04300800000000011001006333ad899044f5d624983aa15a497eb65df4372319091299696efb7f3d7b4cd8023a91081a2ad9c86cfde386a9c79f1c55d78d10bf335a2e43ff812f9df3c3c34bd423cb51081e35c520b80e355ee4ca8a1964a439e7d64fd2e1ddd6c10af140096471093a46c2957009781000000000080dd32c79d17913addb93e6c7b952be8c2f93718867c1e39098daa4b85fc56a26c80000000003b1f4bc000ae038080000000000b000a12c0490f3a2d18421362bc7a0b9aa7302410903302002418228110807b9455b3bbed8d0994cf1fd0d8fcd2e63a03710f470943da74ef0f4513fc6f43811009275b2d4020f8bfc179ae4dd5cb3935c30767f48ee723cca0d708184b01f2c400a3982201102f192e0d772fc5b08cba1e7b1c39dbed4f64439569c493af18a9539818a6f36c0110272c9b5f9058e69485ca53388311c00ff69b5631334ed4e002cef0958389e42880a3a91081a2ad9c86cfde386a9c79f1c55d78d10bf335a2e43ff812f9df3c3c34bd423cb51081e35c520b80e355ee4ca8a1964a439e7d64fd2e1ddd6c10af140096471093a46c295717042f10000000000000000000000000000057e40000000002faf080000000000000000046ec68ce2b1bca12747a13122270527bdad325cd34478d112adcc4bd0fc25f1e814f2919e34f1842677f99901e2aaf7f0abfafd39e6350238b52b8c2bf3b00ff7f00000000000000000000000000000000000000000000000000000000000040f5ca8901722651214939b99ca3c79307f3380af44ae1aecd4d317784fda7a15d80092e9963ce8bc89d6edc9f363dca95f4617c9b8c433e0f1c84c6d525c2fe2b513640000000000ae82180400000000008800803199d6c4c8227aeb124c1d50ad24bf5b2efa1b918c84894cb4b77dbf9ebda66c011d48840d156ce4367ef1c354e3cf8e2aebc6885f99ad1721ffc097cef9e1e1a5ea11e5a8840f1ae2905c071aaf7265450cb2521cf3eb27e970eeeb608578a004b238849d23614ab8000174cb1e745e44eb76e4f9b1ee54afa30be4dc6219f078e42636a92e17f15a89b2000000005d353b426e9963ce8bc89d6edc9f363dca95f4617c9b8c433e0f1c84c6d525c2fe2b513660192a0c75d44f2a6f4e1bc66fddf10b2949b9896cbe8548edeba49c0dd8300d82f42ef7330fb4601c7f2e1af3be67e3c3e86bb4c93a3bd9085c53732111c42dc", + hex"000009010000000003933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134000411bde5f686930a7085566a22fd7fac49000000000000022200000004a817c80000000000000005dc000000000000000102d0001e000bd48a142af4dfb86cd991ad356e17ef245bd58413568ec3800101000000c5017ebac21a9e7d42c23db38b88b689f1efb9ad52d0e728e4553493dcde20dff8f70000000000000111000000009502f90000000000000002ee000000000000000083f0000f015256f7e31cd7f9de64390c3a94e3adf51d0ccc2bd001322f4ccc8d4a1323fb7e81290a232a7ee5a18660742d9368628ddb929322bf8e55695aa3af19002b1fea2e810acfc782fa2344e096e930b4850396e2e004d875727f0839975bd3d79e3419eb81cc09de2631507630dd3788182d4e3e2c16c246fa0277f68efb26f195d11d6ce801a2b78a195c345f107a9dbd8d4927ca9c95b68c9c7431bd64132f1d5012d9c8dd8000000140450000000000000000030000000001770000000002549e60000000000223ca6000122b8f7f0d614f1b4439e38dc516105f660639328ea162648daa422a11369ff4c3000000000015f824810000000000110010682606ad0a329b07977b91626c3018d8c82cf084a7d4ef1f800efa5cd36985e90023a910815256f7e31cd7f9de64390c3a94e3adf51d0ccc2bd001322f4ccc8d4a1323fb7e9081ea642b2e5a831c6e4d1b68a3f138d52582957a4c56da11f68a0149160f4f248d295700ad01000000000080ab8f7f0d614f1b4439e38dc516105f660639328ea162648daa422a11369ff4c30000000000625ece40012c8b0080000000000b000a23484912e6810c08eeb52dfc67cee7a1d9321e1abc1880800000000011001028f4b0e4b17b183bbc7432902506a3accedb2459daf3146d8e0b1ac8d2a4b27782002418228110806873db49b74aa163df0331441bcc8cae3935262ce6accc9ce7e70dec462535c4811036156baddb0c8598cacfd150a6f7f3893d53b784ea0e188bd2400f0d68abf5ff00a398220110054bfe99fb9bd42af0827b4092a86f8c113ffecd69a7e7ac15d057da965d20ea01100c244a344b23872542da30b81f0dadb9790f4370e224de0b75ad606d79f76daf00a3a910815256f7e31cd7f9de64390c3a94e3adf51d0ccc2bd001322f4ccc8d4a1323fb7e9081ea642b2e5a831c6e4d1b68a3f138d52582957a4c56da11f68a0149160f4f248d2957663d311000000000000000000003000000000177000000000223ca600000000002549e602184aefb8063b9f14a8ef4be8ba84c09107359d62c994df78cc3b07e4c2abd7d018c4e716e3df369d6d8b17aed7197e453ac4ebb7a99b55e101cd2347794edc471000000000000000000000000000000000000000000000000000000010000409d47ae68afd388ad7bf011aac01308facdcab44edb8dc6f39409b69c4837f76d400915c7bf86b0a78da21cf1c6e28b082fb3031c994750b13246d52115089b4ffa6180000000000afc124080000000000880083413035685194d83cbbdc8b136180c6c6416784253ea778fc0077d2e69b4c2f48011d48840a92b7bf18e6bfcef321c861d4a71d6fa8e866615e8009917a66646a50991fdbf4840f53215972d418e37268db451f89c6a92c14abd262b6d08fb4500a48b07a7924694ab8000800f80003fffffffffff0020f2d63ebf3cd801d8cd1d3e6be1841a0e1027cff13d633b8efc7362951ad8c040003f0000fffffffffffa00407685484eaf45d16eae74cfb9a045e3e475f69d6362cda0f327659264a2db94d30000fffffffffffa571efe1ac29e368873c71b8a2c20becc0c72651d42c4c91b548454226d3fe986000000002eb1182c8000000040568080000000004055c7bf86b0a78da21cf1c6e28b082fb3031c994750b13246d52115089b4ffa618000000000312f672000964580400000000005800511a4248973408604775a96fe33e773d0ec990f0d5e0c404000000000088008147a587258bd8c1dde3a1948128351d6676d922ced798a36c7058d646952593bc100120c114088403439eda4dba550b1ef8198a20de646571c9a93167356664e73f386f623129ae240881b0ab5d6ed8642cc6567e8a8537bf9c49ea9dbc275070c45e9200786b455faff8051cc11008802a5ff4cfdcdea1578413da0495437c6089fff66b4d3f3d60ae82bed4b2e907500880612251a2591c392a16d185c0f86d6dcbc87a1b871126f05bad6b036bcfbb6d78051d48840a92b7bf18e6bfcef321c861d4a71d6fa8e866615e8009917a66646a50991fdbf4840f53215972d418e37268db451f89c6a92c14abd262b6d08fb4500a48b07a7924694abb31e9888201dc04000000000202a58948e8ec017cafede7ca2686457010875559b273a63b417b6fe6c22eeb21a80200000001c00e00000216600200000000002f522850abd37ee1b36646b4d5b85fbc916f56104d5a3b0e0690608a04420138a23062b387099c97d9458403dd33953e565d054b209e98684f4bd602cca268044076e7132bc91195ff251682cdaf978e6e7998f065ef6d4384c0ae7176888774ec02009ac64206e1126632e2d08e50f47925f11f8b04aba20cad7a65a25d0a32e2931d17945424ce05c00f64ea4206a88d1fa87c84e0c5228a2a5b045dccb605a01117740b58a7384f5d66528d7062d1580000000000000000000000040048ae3dfc35853c6d10e78e371458417d9818e4ca3a85899236a908a844da7fd30c00000001a920ea2ec3e76f7b403ba673b35954861170448627cbe7ecaf7c00ece94988a40048a58948e8ec017cafede7ca2686457010875559b273a63b417b6fe6c22eeb21a8020000009d78c152837378b3cbbc9b373ffbf698792e9046ee8f942855f69cd7808891e000000", + hex"0100220000000103933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b13400092dd581059d2bb431f96f6c199e59a9cdf4ddaea58dca8229725660804592523a80000000000000000000022200000004a817c80000000000000004b0000000000000000102d0001e0016001411e6e9810bf2d21b329be20c89fa19556bdd933c00000003080a8a037245a5d1fc8a4d0cf1bf882c121732b9255a327efba1c1c63e10f6ff481199f30000000000000222000000012a05f20000000000000004b0000000000000000107e0001e028f1b5095a886ec9efca0b014aa794c434f072fc8a435d2e98fe3db571fb26572021021b7b90467b6d39f86b9160d4801dc1e92eedbf5303ffc419fc013bd24a91d02766d36e2bc109b08ec5b0850c53a59372cd306cc1f95cefc4ceb24a6d7886e1b03a9ca87c8642c6770627ee356f92ceb075fa23aed68a6b952b50455ba939c9d85038ffc2170ef33aca1f4741347f1de06cda9f60cd2d5121e6bc8892953a38bb00e000000028a8a0000000000000000080000000002ee0000000000b2872000000000067486e0240098a98f1d736e4650bea1303e122e5e8c80005950b33590856332a2b1bea51f000000002bc0d40100000000002200205be011cd1ed87926bd56a773c1b1907fe457ba0bcc876dc61f32c1ca85470e49475221028f1b5095a886ec9efca0b014aa794c434f072fc8a435d2e98fe3db571fb265722103d5ddbf3cf1c396ad4be4c715759d8389a1f0b9bf1be1344c1258ec9bd79d2c4652aefd015a020000000001010098a98f1d736e4650bea1303e122e5e8c80005950b33590856332a2b1bea51f00000000005141888002b42d000000000000220020143e4a3411ea01f087e0904a2ae0f4a312355368091aa08acf2279f9b6b72711eda40100000000001600149be0e57e4e3561b30fb11014bc3ed2036855381c04004730440220068466106db388aabc63e77d137b815649614d0ac2530589ab4c5e05d78afe3f022064c9ee1be2b7b794b6645c7b5ec8f0e69e727980dc7219fe1715e9803178a98201483045022100e8e5ad22d38e27f56ad53e43e34656026a74ae3527ceb06752f9114483b057d702205978489fb86927818e0b71deeed44c8c5827237f40f92483b36688cc48171bb101475221028f1b5095a886ec9efca0b014aa794c434f072fc8a435d2e98fe3db571fb265722103d5ddbf3cf1c396ad4be4c715759d8389a1f0b9bf1be1344c1258ec9bd79d2c4652aee93b9820000000000000000000080000000002ee00000000067486e00000000000b28720ed5846e908bbaaa6b2f994f3c03f8f96350d2825cd6849104207a8ee263849b302bcc40fecd594b6fa15d22cd5e9a8df070ce97e8a1e90b4fdd8a1ef0ddb4c0d97000000000000000000000000000000000000000000000000000000010000ff036fd9558ffbcee019936ae3251b1696cf0ec92a58a73dcc6e0c33ea64738242e4240098a98f1d736e4650bea1303e122e5e8c80005950b33590856332a2b1bea51f000000002bc0d40100000000002200205be011cd1ed87926bd56a773c1b1907fe457ba0bcc876dc61f32c1ca85470e49475221028f1b5095a886ec9efca0b014aa794c434f072fc8a435d2e98fe3db571fb265722103d5ddbf3cf1c396ad4be4c715759d8389a1f0b9bf1be1344c1258ec9bd79d2c4652ae0001003d0000fffffffffff80100a03da9ba67d38e18a51216c7d501d200aa3127445c959dd972193d3dd5951e7c0003ffffffffffe00098a98f1d736e4650bea1303e122e5e8c80005950b33590856332a2b1bea51f1bffef0000420000ff0088d2195367160d41c7c2bf78ce8996e62b632adfb829c8382955b1e8a5c27008dd7e9d91440a520b59c49af0c1a5a5e1768e5eab47556a81c6248278acc7f5757643497fd7f826957108f4a30fd9cec3aeba79972084e90ead01ea3309000000001bffef00004200005f644c69010100900000000000000001000003e8000000640000000007270e000000", + hex"0100250000000003933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134000425ea3f2629ba65b6849f78829099a1d10000000000000222000000003b9aca000000000000027efb00000000000000010090001e0017a914d73900cac21afc97ce994c27af395e7f4d681bcb870000000182030540ba863ec0edc426981ffa8eace0be4e9a03295b3a0ff6ca545d21983e3b6b0000000000000222000000003b9aca000000000000027efb00000000000000010090001e02b8f1b6e1830cfc069650ea1d7571f7fffc591dd80ba0e2280a6643677de52c2303ac60bfe54dbbd771b9d4c92dd33b584d91cda6f4da296aa10f009f043743aa90034980f41ef05b9248f6793f77666534685df92b54dcb4ee1030f5dbef2e88a4e102177e1b10f681a1a46221c0f87aaa8e2a49d8257924d229faf8525e3f447374e5023c6191ef9b284cc6aa0c88b3913d91bf1bde6c5ec6f9d6f8dafa6bb65c2dcbbd000000010a01000000000000011f00000000251c000000000000000000000003cf01bee02412f1713bd4417815932d254d0e2e1ddc9292f81c41c90de45e6ae6301934c73c000000002b0c9af90000000000220020b2ad00d661059d790dea8056dfd8a962a53023a3603fda636c20eb8b4e434ecb475221029eb94e19945896a4cbe830d925272d3edb4426096b53cd88012edd1cc0518ff22102b8f1b6e1830cfc069650ea1d7571f7fffc591dd80ba0e2280a6643677de52c2352aefd01300200000000010112f1713bd4417815932d254d0e2e1ddc9292f81c41c90de45e6ae6301934c73c0000000000e3400480012e7ff90000000000160014c6a763425c341e0ba7d0c12ed9126a661e38aac3040048304502210097df6e1d55051150897b7196be2944239dc1d820ae08ba72cffdd2822d57da320220403951e2355f52e385a34665156402cb2e85e6133b3d2606e37947809ccf4888014830450221008700f11d141bad2fc7eb66163a8f621685420b75bfb9f2c49c7227bf8fdb2ef702202f4a8485c71dad72263bcae61d6e17f21fbbe24331c3119deda2eaa1420cd74e01475221029eb94e19945896a4cbe830d925272d3edb4426096b53cd88012edd1cc0518ff22102b8f1b6e1830cfc069650ea1d7571f7fffc591dd80ba0e2280a6643677de52c2352aea375b2200000000000000000011f00000000251c00000003cf01bee00000000000000000a6b6d346b134eeb64ed57d0b125934490af31cbb650813ae6454ab83d12042550331d262498b6ff23a23ac5a3e834afddf752bf1b5e81259233316a9ec72f5562f000000000000000000000000000000000000000000000000000000000000ff02db56e0e64c827f44aade7b016a37e6a7c0780db3666f7d8e8b422b6b02474b362412f1713bd4417815932d254d0e2e1ddc9292f81c41c90de45e6ae6301934c73c000000002b0c9af90000000000220020b2ad00d661059d790dea8056dfd8a962a53023a3603fda636c20eb8b4e434ecb475221029eb94e19945896a4cbe830d925272d3edb4426096b53cd88012edd1cc0518ff22102b8f1b6e1830cfc069650ea1d7571f7fffc591dd80ba0e2280a6643677de52c2352ae0006003f0000fffffffffee20041f7ae2006d76bc11dc18f8457cb4f76df375a85312315edbcfe508aca1596bcf4007a0001fffffffffdd002022e11a1cea6e7a8d662f74967d072ac654a72b59ada363c0e363ec4d26f8ef6800380000ffffffffff002065215a990d4af376ceb7647998ceea281d44fba94ec18c3a505f595fae0efe79003c0000fffffffffef00209a10496ebab959fe95ddfbe43f26cc9566bdc3a9cebc509e098367a2916b5e86003e0000fffffffffee40083551db0a0be081e7788bf7b13023ab3f306657022a9623a2179ca37c92f2e0d3801000003fffffffffb84008210ec1faedb71958c276e8e1502e7e1e588d4406cc9986157958e9d84f02a667e0001fffffffffdc212f1713bd4417815932d254d0e2e1ddc9292f81c41c90de45e6ae6301934c73c00000000005f47acf200000000fffd01300200000000010112f1713bd4417815932d254d0e2e1ddc9292f81c41c90de45e6ae6301934c73c0000000000e3400480012e7ff90000000000160014c6a763425c341e0ba7d0c12ed9126a661e38aac3040048304502210097df6e1d55051150897b7196be2944239dc1d820ae08ba72cffdd2822d57da320220403951e2355f52e385a34665156402cb2e85e6133b3d2606e37947809ccf4888014830450221008700f11d141bad2fc7eb66163a8f621685420b75bfb9f2c49c7227bf8fdb2ef702202f4a8485c71dad72263bcae61d6e17f21fbbe24331c3119deda2eaa1420cd74e01475221029eb94e19945896a4cbe830d925272d3edb4426096b53cd88012edd1cc0518ff22102b8f1b6e1830cfc069650ea1d7571f7fffc591dd80ba0e2280a6643677de52c2352aea375b2200000000000000000012412f1713bd4417815932d254d0e2e1ddc9292f81c41c90de45e6ae6301934c73c0000000083b5c6292f61ad3cba1e702abb6d4ec1aec503c5b1b393e09c942ad4448a1b930000000000", + hex"0200050000000103933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b1340009e9907c0bc4f4e5b55a3b7012180e63b0ebf76498c543b991c056f0930a6ac09d80000000000000000000022200000004a817c800000000000000c350000000000000000102d0001e0016001495cde5680fa7aaa16935b74cc11b4ee695aa6b1500000004080aa98202cc1bef9c46bae2f3a965d7bf4bfca249098c5847b71d700ca0eba00db523986a0000000000000222000000012a05f200000000000000c350000000000000000107e0001e026345c7976588f6d96e7438f8df34e3225d527e9da5e201dbf83b43a1f4c2731603d49ddadc0517b1bb1f9c2773621e62b7720b2a622e4a5548becc37164bcd70f10368718d6b2887b302f75e5af0bac2f3b883663bde0fd61344ce16ed9a31c55eda03530674aa8610a599d0cd8be226923b5d8fe2a422cfbdc4fb790e39c7b05e0b7e0246ce4c46c2ee4110cce17bae3c7e6de01a8f0f8c1970cf58b2122b8fc77ffdeb000000028a8a0000000000000001aa0000000002ee0000000019545f970000000110b19269240e985f9ec14d882a73f50843ad0fbcf37c644100b13c7eb3d91da703246a669d000000002b404b4c0000000000220020c670f08ef02bd0e9226f315eb2e2d193d2946d4aa3d03e612a0bdda231cfe9c4475221026345c7976588f6d96e7438f8df34e3225d527e9da5e201dbf83b43a1f4c273162103f4b51b541e6a9d935e83828bedbfcfb0ce404c809712376e672b624bb250beba52aefd015a020000000001010e985f9ec14d882a73f50843ad0fbcf37c644100b13c7eb3d91da703246a669d00000000008dc3288002ff7b0600000000002200206444bace1cb90460914f5c964acfdd7846104e93a205d0bd5d00eb73f03acced21cd4500000000001600148636658ef4d15c8d9824bfea9b70ddc592b24bb404004730440220137ad66cce66df0041e172036c0c6de1e1cc8981130883bf693960778a2160fa022039d9505c98f78f54aa30172f4deccae26f9c4a7b55e2b72d4bd8875809143d5501483045022100ced9a63de710f1339c5d9086b1cbe0097f942872fbf1d0ca3a643409933cc86802201d5e311f655f64fb64eae62c9a3e321329158d055ecce9c537657979c17fe62501475221026345c7976588f6d96e7438f8df34e3225d527e9da5e201dbf83b43a1f4c273162103f4b51b541e6a9d935e83828bedbfcfb0ce404c809712376e672b624bb250beba52ae38497c20000000000000000001aa0000000002ee0000000110b192690000000019545f97359430d3b112dd6d24edb449958073132a7721c737f2a72edf12ff74606d6c6f022030518cd036759a25ae66be2bbd46855ba6cdd214742f42aecd72b9093a444a000000000000000000000000000000000000000000000000000000d10000ff0200c2341c9b6d1ba8955188aa913cbf5b303c65ad19491df7d15fa0a811c44d38240e985f9ec14d882a73f50843ad0fbcf37c644100b13c7eb3d91da703246a669d000000002b404b4c0000000000220020c670f08ef02bd0e9226f315eb2e2d193d2946d4aa3d03e612a0bdda231cfe9c4475221026345c7976588f6d96e7438f8df34e3225d527e9da5e201dbf83b43a1f4c273162103f4b51b541e6a9d935e83828bedbfcfb0ce404c809712376e672b624bb250beba52ae0005003d0000fffffffffe580103151b3b767e35873dd3babc0f5bc9ea4a99069c269456b9e1157dda87db454b7801f80007fffffffff2b0020b4a390fde1b8bf038232ea79e48b825b5d1e930a97f2532aacbe0ddfaf24e9be00380000ffffffffff002038da5bbdce565d1eea32b7b9f4c4932e63892a154197054f5eb0116aab0f41de003b0000fffffffffe60041298f04989916fa9ac7b83da8a340a8bc6fcad73925c190576d728b28dfcf8de400720001fffffffffd00204225a2a872ea98ff1b22991635a2d6cb598839bd8a3988eeeb53adf784149fa880007fffffffff2b000e985f9ec14d882a73f50843ad0fbcf37c644100b13c7eb3d91da703246a669d0000000000001e2d5a0004240e985f9ec14d882a73f50843ad0fbcf37c644100b13c7eb3d91da703246a669d000000002b404b4c0000000000220020c670f08ef02bd0e9226f315eb2e2d193d2946d4aa3d03e612a0bdda231cfe9c4475221026345c7976588f6d96e7438f8df34e3225d527e9da5e201dbf83b43a1f4c273162103f4b51b541e6a9d935e83828bedbfcfb0ce404c809712376e672b624bb250beba52ae7202000000010e985f9ec14d882a73f50843ad0fbcf37c644100b13c7eb3d91da703246a669d0000000000ffffffff02ff7b06000000000016001495cde5680fa7aaa16935b74cc11b4ee695aa6b15eecd45000000000017a9142a90566bc7c0515d50552fb8bdf9e7f5c541637c8700000000ff000000000000000000067bff16001495cde5680fa7aaa16935b74cc11b4ee695aa6b15240e985f9ec14d882a73f50843ad0fbcf37c644100b13c7eb3d91da703246a669d000000002b404b4c0000000000220020c670f08ef02bd0e9226f315eb2e2d193d2946d4aa3d03e612a0bdda231cfe9c4475221026345c7976588f6d96e7438f8df34e3225d527e9da5e201dbf83b43a1f4c273162103f4b51b541e6a9d935e83828bedbfcfb0ce404c809712376e672b624bb250beba52ae7202000000010e985f9ec14d882a73f50843ad0fbcf37c644100b13c7eb3d91da703246a669d0000000000ffffffff02ff7b06000000000016001495cde5680fa7aaa16935b74cc11b4ee695aa6b15c4cd45000000000017a9142a90566bc7c0515d50552fb8bdf9e7f5c541637c8700000000ff000000000000000000067bff16001495cde5680fa7aaa16935b74cc11b4ee695aa6b15240e985f9ec14d882a73f50843ad0fbcf37c644100b13c7eb3d91da703246a669d000000002b404b4c0000000000220020c670f08ef02bd0e9226f315eb2e2d193d2946d4aa3d03e612a0bdda231cfe9c4475221026345c7976588f6d96e7438f8df34e3225d527e9da5e201dbf83b43a1f4c273162103f4b51b541e6a9d935e83828bedbfcfb0ce404c809712376e672b624bb250beba52ae7202000000010e985f9ec14d882a73f50843ad0fbcf37c644100b13c7eb3d91da703246a669d0000000000ffffffff02ff7b06000000000016001495cde5680fa7aaa16935b74cc11b4ee695aa6b15bacd45000000000017a9142a90566bc7c0515d50552fb8bdf9e7f5c541637c8700000000ff000000000000000000067bff16001495cde5680fa7aaa16935b74cc11b4ee695aa6b15240e985f9ec14d882a73f50843ad0fbcf37c644100b13c7eb3d91da703246a669d000000002b404b4c0000000000220020c670f08ef02bd0e9226f315eb2e2d193d2946d4aa3d03e612a0bdda231cfe9c4475221026345c7976588f6d96e7438f8df34e3225d527e9da5e201dbf83b43a1f4c273162103f4b51b541e6a9d935e83828bedbfcfb0ce404c809712376e672b624bb250beba52ae7202000000010e985f9ec14d882a73f50843ad0fbcf37c644100b13c7eb3d91da703246a669d0000000000ffffffff02ff7b06000000000016001495cde5680fa7aaa16935b74cc11b4ee695aa6b15b8cd45000000000017a9142a90566bc7c0515d50552fb8bdf9e7f5c541637c8700000000ff000000000000000000067bff16001495cde5680fa7aaa16935b74cc11b4ee695aa6b150001240e985f9ec14d882a73f50843ad0fbcf37c644100b13c7eb3d91da703246a669d000000002b404b4c0000000000220020c670f08ef02bd0e9226f315eb2e2d193d2946d4aa3d03e612a0bdda231cfe9c4475221026345c7976588f6d96e7438f8df34e3225d527e9da5e201dbf83b43a1f4c273162103f4b51b541e6a9d935e83828bedbfcfb0ce404c809712376e672b624bb250beba52aefd014f020000000001010e985f9ec14d882a73f50843ad0fbcf37c644100b13c7eb3d91da703246a669d0000000000ffffffff02ff7b06000000000016001495cde5680fa7aaa16935b74cc11b4ee695aa6b15b8cd45000000000017a9142a90566bc7c0515d50552fb8bdf9e7f5c541637c87040047304402203167bba6344d2d82aa11db437dcfd17903de22079f58597f8927813cb96c32c3022036ead9938307bcc82561f85cebd8123b273ca26e9aeafc6e0502e97a38b508da01483045022100e0cffda9bd2bd045b99024d99597698a25803d42cd22c8b58d7a9e29363e79e802202a0e27d553bce59bb7b4e2cd89b847ade01d39bcb1027e0a7c0b6e0d4fff096601475221026345c7976588f6d96e7438f8df34e3225d527e9da5e201dbf83b43a1f4c273162103f4b51b541e6a9d935e83828bedbfcfb0ce404c809712376e672b624bb250beba52ae00000000ff000000000000000000067bff16001495cde5680fa7aaa16935b74cc11b4ee695aa6b15000000000000", + ) + + oldbins.foreach { oldbin => + + // we decode with compat codec + val oldnormal = stateDataCodec.decode(oldbin.bits).require.value + // and we encode with new codec + val newbin = stateDataCodec.encode(oldnormal).require.bytes + // make sure that round-trip yields the same data + val newnormal = stateDataCodec.decode(newbin.bits).require.value + assert(newnormal === oldnormal) + // make sure that we have stripped sigs from the transactions + assert(newnormal.commitments.localCommit.commitTxAndRemoteSig.commitTx.tx.txIn.forall(_.witness.stack.isEmpty)) + assert(newnormal.commitments.localCommit.htlcTxsAndRemoteSigs.forall(_.htlcTx.tx.txIn.forall(_.witness.stack.isEmpty))) + // make sure that we have extracted the remote sig of the local tx + Transactions.checkSig(newnormal.commitments.localCommit.commitTxAndRemoteSig.commitTx, newnormal.commitments.localCommit.commitTxAndRemoteSig.remoteSig, newnormal.commitments.remoteNodeId, TxOwner.Remote, newnormal.commitments.commitmentFormat) + } + } + } object ChannelCodecsSpec { @@ -293,7 +324,18 @@ object ChannelCodecsSpec { val fundingAmount = fundingTx.txOut.head.amount val commitmentInput = Funding.makeFundingInputInfo(fundingTx.hash, 0, fundingAmount, channelKeyManager.fundingPublicKey(localParams.fundingKeyPath).publicKey, remoteParams.fundingPubKey) - val localCommit = LocalCommit(0, CommitmentSpec(htlcs.toSet, FeeratePerKw(1500 sat), 50000000 msat, 70000000 msat), PublishableTxs(CommitTx(commitmentInput, Transaction(2, Nil, Nil, 0)), Nil)) + val remoteSig = ByteVector64(hex"2148d2d4aac8c793eb82d31bcf22d4db707b9fd7eee1b89b4b1444c9e19ab7172bab8c3d997d29163fa0cb255c75afb8ade13617ad1350c1515e9be4a222a04d") + val commitTx = Transaction( + version = 2, + txIn = TxIn( + outPoint = commitmentInput.outPoint, + signatureScript = ByteVector.empty, + sequence = 0, + witness = Scripts.witness2of2(randomBytes64(), remoteSig, channelKeyManager.fundingPublicKey(localParams.fundingKeyPath).publicKey, remoteParams.fundingPubKey)) :: Nil, + txOut = Nil, + lockTime = 0 + ) + val localCommit = LocalCommit(0, CommitmentSpec(htlcs.toSet, FeeratePerKw(1500 sat), 50000000 msat, 70000000 msat), CommitTxAndRemoteSig(CommitTx(commitmentInput, commitTx), remoteSig), Nil) val remoteCommit = RemoteCommit(0, CommitmentSpec(htlcs.map(_.opposite).toSet, FeeratePerKw(1500 sat), 50000 msat, 700000 msat), ByteVector32(hex"0303030303030303030303030303030303030303030303030303030303030303"), PrivateKey(ByteVector.fill(32)(4)).publicKey) val commitments = Commitments(ChannelVersion.STANDARD, localParams, remoteParams, channelFlags = 0x01.toByte, localCommit, remoteCommit, LocalChanges(Nil, Nil, Nil), RemoteChanges(Nil, Nil, Nil), localNextHtlcId = 32L, diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/wire/internal/channel/version1/ChannelCodecs1Spec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/wire/internal/channel/version1/ChannelCodecs1Spec.scala index 567bfdfdfb..95f4ebdf15 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/wire/internal/channel/version1/ChannelCodecs1Spec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/wire/internal/channel/version1/ChannelCodecs1Spec.scala @@ -197,12 +197,4 @@ class ChannelCodecs1Spec extends AnyFunSuite { assert(spentMapCodec.decodeValue(spentMapCodec.encode(map).require).require === map) } - test("basic serialization test (NORMAL)") { - val data = normal - val bin = DATA_NORMAL_Codec.encode(data).require - val check = DATA_NORMAL_Codec.decodeValue(bin).require - assert(data.commitments.localCommit.spec === check.commitments.localCommit.spec) - assert(data === check) - } - } diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/wire/internal/channel/version3/ChannelCodecs3Spec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/wire/internal/channel/version3/ChannelCodecs3Spec.scala new file mode 100644 index 0000000000..ddad8eb4b8 --- /dev/null +++ b/eclair-core/src/test/scala/fr/acinq/eclair/wire/internal/channel/version3/ChannelCodecs3Spec.scala @@ -0,0 +1,17 @@ +package fr.acinq.eclair.wire.internal.channel.version3 + +import fr.acinq.eclair.wire.internal.channel.ChannelCodecsSpec.normal +import fr.acinq.eclair.wire.internal.channel.version3.ChannelCodecs3.Codecs.DATA_NORMAL_Codec +import org.scalatest.funsuite.AnyFunSuite + +class ChannelCodecs3Spec extends AnyFunSuite { + + test("basic serialization test (NORMAL)") { + val data = normal + val bin = DATA_NORMAL_Codec.encode(data).require + val check = DATA_NORMAL_Codec.decodeValue(bin).require + assert(data.commitments.localCommit.spec === check.commitments.localCommit.spec) + assert(data === check) + } + +}