From cbf96d554c66b6cdb8526a39ef01f8bdf60ae9c5 Mon Sep 17 00:00:00 2001 From: t-bast Date: Mon, 6 Jun 2022 09:19:15 +0200 Subject: [PATCH 1/3] Improve htlc_maximum_msat in channel updates We previously set the `htlc_maximum_msat` inside `channel_update` to the channel's capacity, but that didn't make any sense: we will reject htlcs that are above the local or remote `max_htlc_value_in_flight_msat`. We now set this value to match the lowest `max_htlc_value_in_flight_msat` of the channel, and properly type our local value to be a millisatoshi amount instead of a more generic UInt64. --- .../main/scala/fr/acinq/eclair/NodeParams.scala | 2 +- .../fr/acinq/eclair/channel/ChannelData.scala | 2 +- .../fr/acinq/eclair/channel/Commitments.scala | 15 +++++++++++---- .../fr/acinq/eclair/channel/fsm/Channel.scala | 16 ++++++++-------- .../channel/fsm/ChannelOpenSingleFunder.scala | 6 +++--- .../src/main/scala/fr/acinq/eclair/io/Peer.scala | 2 +- .../eclair/payment/relay/ChannelRelay.scala | 3 +++ .../channel/version0/ChannelCodecs0.scala | 2 +- .../channel/version1/ChannelCodecs1.scala | 2 +- .../channel/version2/ChannelCodecs2.scala | 2 +- .../channel/version3/ChannelCodecs3.scala | 2 +- .../scala/fr/acinq/eclair/TestConstants.scala | 4 ++-- .../acinq/eclair/channel/CommitmentsSpec.scala | 4 ++-- .../states/ChannelStateTestsHelperMethods.scala | 6 +++--- .../channel/states/e/NormalStateSpec.scala | 8 ++++---- .../acinq/eclair/json/JsonSerializersSpec.scala | 3 --- .../acinq/eclair/payment/PaymentPacketSpec.scala | 8 ++++---- .../payment/relay/ChannelRelayerSpec.scala | 4 +++- .../internal/channel/ChannelCodecsSpec.scala | 10 +++++----- .../channel/version1/ChannelCodecs1Spec.scala | 2 +- .../channel/version2/ChannelCodecs2Spec.scala | 6 +++--- .../channel/version3/ChannelCodecs3Spec.scala | 6 +++--- 22 files changed, 62 insertions(+), 53 deletions(-) diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/NodeParams.scala b/eclair-core/src/main/scala/fr/acinq/eclair/NodeParams.scala index 7a7fdbb066..58308cb826 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/NodeParams.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/NodeParams.scala @@ -416,7 +416,7 @@ object NodeParams extends Logging { dustLimit = dustLimitSatoshis, maxRemoteDustLimit = Satoshi(config.getLong("channel.max-remote-dust-limit-satoshis")), htlcMinimum = htlcMinimum, - maxHtlcValueInFlightMsat = UInt64(config.getLong("channel.max-htlc-value-in-flight-msat")), + maxHtlcValueInFlightMsat = MilliSatoshi(config.getLong("channel.max-htlc-value-in-flight-msat")), maxAcceptedHtlcs = maxAcceptedHtlcs, reserveToFundingRatio = config.getDouble("channel.reserve-to-funding-ratio"), maxReserveToFundingRatio = config.getDouble("channel.max-reserve-to-funding-ratio"), diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/channel/ChannelData.scala b/eclair-core/src/main/scala/fr/acinq/eclair/channel/ChannelData.scala index 538f69d9ac..d98a7708d3 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/channel/ChannelData.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/channel/ChannelData.scala @@ -492,7 +492,7 @@ final case class DATA_WAIT_FOR_REMOTE_PUBLISH_FUTURE_COMMITMENT(commitments: Com case class LocalParams(nodeId: PublicKey, fundingKeyPath: DeterministicWallet.KeyPath, dustLimit: Satoshi, - maxHtlcValueInFlightMsat: UInt64, // this is not MilliSatoshi because it can exceed the total amount of MilliSatoshi + maxHtlcValueInFlightMsat: MilliSatoshi, requestedChannelReserve_opt: Option[Satoshi], htlcMinimum: MilliSatoshi, toSelfDelay: CltvExpiryDelta, 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 2294a09a6c..34ee34c71c 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 @@ -211,6 +211,13 @@ case class Commitments(channelId: ByteVector32, val capacity: Satoshi = commitInput.txOut.amount + val maxHtlcAmount: MilliSatoshi = if (remoteParams.maxHtlcValueInFlightMsat < localParams.maxHtlcValueInFlightMsat) { + // We can safely cast to millisatoshis in this case. + remoteParams.maxHtlcValueInFlightMsat.toBigInt.toLong.msat + } else { + localParams.maxHtlcValueInFlightMsat + } + /** Channel reserve that applies to our funds. */ val localChannelReserve: Satoshi = remoteParams.requestedChannelReserve_opt.getOrElse(0 sat) @@ -393,9 +400,9 @@ object Commitments { // We apply local *and* remote restrictions, to ensure both peers are happy with the resulting number of HTLCs. // NB: we need the `toSeq` because otherwise duplicate amountMsat would be removed (since outgoingHtlcs is a Set). val htlcValueInFlight = outgoingHtlcs.toSeq.map(_.amountMsat).sum - if (Seq(commitments1.localParams.maxHtlcValueInFlightMsat, commitments1.remoteParams.maxHtlcValueInFlightMsat).min < htlcValueInFlight) { - // TODO: this should be a specific UPDATE error (but it would require a spec change) - return Left(HtlcValueTooHighInFlight(commitments.channelId, maximum = Seq(commitments1.localParams.maxHtlcValueInFlightMsat, commitments1.remoteParams.maxHtlcValueInFlightMsat).min, actual = htlcValueInFlight)) + val allowedHtlcValueInFlight = Seq(UInt64(commitments1.localParams.maxHtlcValueInFlightMsat.toLong), commitments1.remoteParams.maxHtlcValueInFlightMsat).min + if (allowedHtlcValueInFlight < htlcValueInFlight) { + return Left(HtlcValueTooHighInFlight(commitments.channelId, maximum = allowedHtlcValueInFlight, actual = htlcValueInFlight)) } if (Seq(commitments1.localParams.maxAcceptedHtlcs, commitments1.remoteParams.maxAcceptedHtlcs).min < outgoingHtlcs.size) { return Left(TooManyAcceptedHtlcs(commitments.channelId, maximum = Seq(commitments1.localParams.maxAcceptedHtlcs, commitments1.remoteParams.maxAcceptedHtlcs).min)) @@ -462,7 +469,7 @@ object Commitments { // NB: we need the `toSeq` because otherwise duplicate amountMsat would be removed (since incomingHtlcs is a Set). val htlcValueInFlight = incomingHtlcs.toSeq.map(_.amountMsat).sum if (commitments1.localParams.maxHtlcValueInFlightMsat < htlcValueInFlight) { - return Left(HtlcValueTooHighInFlight(commitments.channelId, maximum = commitments1.localParams.maxHtlcValueInFlightMsat, actual = htlcValueInFlight)) + return Left(HtlcValueTooHighInFlight(commitments.channelId, maximum = UInt64(commitments1.localParams.maxHtlcValueInFlightMsat.toLong), actual = htlcValueInFlight)) } if (incomingHtlcs.size > commitments1.localParams.maxAcceptedHtlcs) { diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/channel/fsm/Channel.scala b/eclair-core/src/main/scala/fr/acinq/eclair/channel/fsm/Channel.scala index 1e6fec2f99..f195f1c384 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/channel/fsm/Channel.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/channel/fsm/Channel.scala @@ -64,7 +64,7 @@ object Channel { dustLimit: Satoshi, maxRemoteDustLimit: Satoshi, htlcMinimum: MilliSatoshi, - maxHtlcValueInFlightMsat: UInt64, + maxHtlcValueInFlightMsat: MilliSatoshi, maxAcceptedHtlcs: Int, reserveToFundingRatio: Double, maxReserveToFundingRatio: Double, @@ -222,7 +222,7 @@ class Channel(val nodeParams: NodeParams, val wallet: OnChainChannelFunder, val fundingSatoshis = fundingSatoshis, pushMsat = pushMsat, dustLimitSatoshis = localParams.dustLimit, - maxHtlcValueInFlightMsat = localParams.maxHtlcValueInFlightMsat, + maxHtlcValueInFlightMsat = UInt64(localParams.maxHtlcValueInFlightMsat.toLong), channelReserveSatoshis = localParams.requestedChannelReserve_opt.getOrElse(0 sat), htlcMinimumMsat = localParams.htlcMinimum, feeratePerKw = commitTxFeerate, @@ -627,7 +627,7 @@ class Channel(val nodeParams: NodeParams, val wallet: OnChainChannelFunder, val val channelUpdate1 = if (d.channelUpdate.shortChannelId != scidForChannelUpdate) { log.info(s"using new scid in channel_update: old=${d.channelUpdate.shortChannelId} new=$scidForChannelUpdate") // we re-announce the channelUpdate for the same reason - Announcements.makeChannelUpdate(nodeParams.chainHash, nodeParams.privateKey, remoteNodeId, scidForChannelUpdate, d.channelUpdate.cltvExpiryDelta, d.channelUpdate.htlcMinimumMsat, d.channelUpdate.feeBaseMsat, d.channelUpdate.feeProportionalMillionths, d.commitments.capacity.toMilliSatoshi, enable = Helpers.aboveReserve(d.commitments)) + Announcements.makeChannelUpdate(nodeParams.chainHash, nodeParams.privateKey, remoteNodeId, scidForChannelUpdate, d.channelUpdate.cltvExpiryDelta, d.channelUpdate.htlcMinimumMsat, d.channelUpdate.feeBaseMsat, d.channelUpdate.feeProportionalMillionths, d.commitments.maxHtlcAmount, enable = Helpers.aboveReserve(d.commitments)) } else { d.channelUpdate } @@ -682,7 +682,7 @@ class Channel(val nodeParams: NodeParams, val wallet: OnChainChannelFunder, val } case Event(c: CMD_UPDATE_RELAY_FEE, d: DATA_NORMAL) => - val channelUpdate1 = Announcements.makeChannelUpdate(nodeParams.chainHash, nodeParams.privateKey, remoteNodeId, scidForChannelUpdate(d), c.cltvExpiryDelta_opt.getOrElse(d.channelUpdate.cltvExpiryDelta), d.channelUpdate.htlcMinimumMsat, c.feeBase, c.feeProportionalMillionths, d.commitments.capacity.toMilliSatoshi, enable = Helpers.aboveReserve(d.commitments)) + val channelUpdate1 = Announcements.makeChannelUpdate(nodeParams.chainHash, nodeParams.privateKey, remoteNodeId, scidForChannelUpdate(d), c.cltvExpiryDelta_opt.getOrElse(d.channelUpdate.cltvExpiryDelta), d.channelUpdate.htlcMinimumMsat, c.feeBase, c.feeProportionalMillionths, d.commitments.maxHtlcAmount, enable = Helpers.aboveReserve(d.commitments)) log.info(s"updating relay fees: prev={} next={}", d.channelUpdate.toStringShort, channelUpdate1.toStringShort) val replyTo = if (c.replyTo == ActorRef.noSender) sender() else c.replyTo replyTo ! RES_SUCCESS(c, d.channelId) @@ -691,7 +691,7 @@ class Channel(val nodeParams: NodeParams, val wallet: OnChainChannelFunder, val case Event(BroadcastChannelUpdate(reason), d: DATA_NORMAL) => val age = TimestampSecond.now() - d.channelUpdate.timestamp - val channelUpdate1 = Announcements.makeChannelUpdate(nodeParams.chainHash, nodeParams.privateKey, remoteNodeId, scidForChannelUpdate(d), d.channelUpdate.cltvExpiryDelta, d.channelUpdate.htlcMinimumMsat, d.channelUpdate.feeBaseMsat, d.channelUpdate.feeProportionalMillionths, d.commitments.capacity.toMilliSatoshi, enable = Helpers.aboveReserve(d.commitments)) + val channelUpdate1 = Announcements.makeChannelUpdate(nodeParams.chainHash, nodeParams.privateKey, remoteNodeId, scidForChannelUpdate(d), d.channelUpdate.cltvExpiryDelta, d.channelUpdate.htlcMinimumMsat, d.channelUpdate.feeBaseMsat, d.channelUpdate.feeProportionalMillionths, d.commitments.maxHtlcAmount, enable = Helpers.aboveReserve(d.commitments)) reason match { case Reconnected if d.commitments.announceChannel && Announcements.areSame(channelUpdate1, d.channelUpdate) && age < REFRESH_CHANNEL_UPDATE_INTERVAL => // we already sent an identical channel_update not long ago (flapping protection in case we keep being disconnected/reconnected) @@ -715,7 +715,7 @@ class Channel(val nodeParams: NodeParams, val wallet: OnChainChannelFunder, val // if we have pending unsigned htlcs, then we cancel them and generate an update with the disabled flag set, that will be returned to the sender in a temporary channel failure if (d.commitments.localChanges.proposed.collectFirst { case add: UpdateAddHtlc => add }.isDefined) { log.debug("updating channel_update announcement (reason=disabled)") - val channelUpdate1 = Announcements.makeChannelUpdate(nodeParams.chainHash, nodeParams.privateKey, remoteNodeId, scidForChannelUpdate(d), d.channelUpdate.cltvExpiryDelta, d.channelUpdate.htlcMinimumMsat, d.channelUpdate.feeBaseMsat, d.channelUpdate.feeProportionalMillionths, d.commitments.capacity.toMilliSatoshi, enable = false) + val channelUpdate1 = Announcements.makeChannelUpdate(nodeParams.chainHash, nodeParams.privateKey, remoteNodeId, scidForChannelUpdate(d), d.channelUpdate.cltvExpiryDelta, d.channelUpdate.htlcMinimumMsat, d.channelUpdate.feeBaseMsat, d.channelUpdate.feeProportionalMillionths, d.commitments.maxHtlcAmount, enable = false) // NB: the htlcs stay() in the commitments.localChange, they will be cleaned up after reconnection d.commitments.localChanges.proposed.collect { case add: UpdateAddHtlc => relayer ! RES_ADD_SETTLED(d.commitments.originChannels(add.id), add, HtlcResult.DisconnectedBeforeSigned(channelUpdate1)) @@ -1794,7 +1794,7 @@ class Channel(val nodeParams: NodeParams, val wallet: OnChainChannelFunder, val if (d.channelUpdate.channelFlags.isEnabled) { // if the channel isn't disabled we generate a new channel_update log.info("updating channel_update announcement (reason=disabled)") - val channelUpdate1 = Announcements.makeChannelUpdate(nodeParams.chainHash, nodeParams.privateKey, remoteNodeId, scidForChannelUpdate(d), d.channelUpdate.cltvExpiryDelta, d.channelUpdate.htlcMinimumMsat, d.channelUpdate.feeBaseMsat, d.channelUpdate.feeProportionalMillionths, d.commitments.capacity.toMilliSatoshi, enable = false) + val channelUpdate1 = Announcements.makeChannelUpdate(nodeParams.chainHash, nodeParams.privateKey, remoteNodeId, scidForChannelUpdate(d), d.channelUpdate.cltvExpiryDelta, d.channelUpdate.htlcMinimumMsat, d.channelUpdate.feeBaseMsat, d.channelUpdate.feeProportionalMillionths, d.commitments.maxHtlcAmount, enable = false) // then we update the state and replay the request self forward c // we use goto() to fire transitions @@ -1807,7 +1807,7 @@ class Channel(val nodeParams: NodeParams, val wallet: OnChainChannelFunder, val } private def handleUpdateRelayFeeDisconnected(c: CMD_UPDATE_RELAY_FEE, d: DATA_NORMAL) = { - val channelUpdate1 = Announcements.makeChannelUpdate(nodeParams.chainHash, nodeParams.privateKey, remoteNodeId, scidForChannelUpdate(d), c.cltvExpiryDelta_opt.getOrElse(d.channelUpdate.cltvExpiryDelta), d.channelUpdate.htlcMinimumMsat, c.feeBase, c.feeProportionalMillionths, d.commitments.capacity.toMilliSatoshi, enable = false) + val channelUpdate1 = Announcements.makeChannelUpdate(nodeParams.chainHash, nodeParams.privateKey, remoteNodeId, scidForChannelUpdate(d), c.cltvExpiryDelta_opt.getOrElse(d.channelUpdate.cltvExpiryDelta), d.channelUpdate.htlcMinimumMsat, c.feeBase, c.feeProportionalMillionths, d.commitments.maxHtlcAmount, enable = false) log.info(s"updating relay fees: prev={} next={}", d.channelUpdate.toStringShort, channelUpdate1.toStringShort) val replyTo = if (c.replyTo == ActorRef.noSender) sender() else c.replyTo replyTo ! RES_SUCCESS(c, d.channelId) diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/channel/fsm/ChannelOpenSingleFunder.scala b/eclair-core/src/main/scala/fr/acinq/eclair/channel/fsm/ChannelOpenSingleFunder.scala index 8966b25364..ae3f6ccfda 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/channel/fsm/ChannelOpenSingleFunder.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/channel/fsm/ChannelOpenSingleFunder.scala @@ -32,7 +32,7 @@ import fr.acinq.eclair.router.Announcements import fr.acinq.eclair.transactions.Transactions.TxOwner import fr.acinq.eclair.transactions.{Scripts, Transactions} import fr.acinq.eclair.wire.protocol.{AcceptChannel, AnnouncementSignatures, ChannelReady, ChannelTlv, Error, FundingCreated, FundingSigned, OpenChannel, TlvStream} -import fr.acinq.eclair.{Features, RealShortChannelId, ToMilliSatoshiConversion, randomKey, toLongId} +import fr.acinq.eclair.{Features, RealShortChannelId, UInt64, randomKey, toLongId} import scodec.bits.ByteVector import scala.concurrent.duration.DurationInt @@ -87,7 +87,7 @@ trait ChannelOpenSingleFunder extends FundingHandlers with ErrorHandlers { val localShutdownScript = if (Features.canUseFeature(localParams.initFeatures, remoteInit.features, Features.UpfrontShutdownScript)) localParams.defaultFinalScriptPubKey else ByteVector.empty val accept = AcceptChannel(temporaryChannelId = open.temporaryChannelId, dustLimitSatoshis = localParams.dustLimit, - maxHtlcValueInFlightMsat = localParams.maxHtlcValueInFlightMsat, + maxHtlcValueInFlightMsat = UInt64(localParams.maxHtlcValueInFlightMsat.toLong), channelReserveSatoshis = localParams.requestedChannelReserve_opt.getOrElse(0 sat), minimumDepth = minimumDepth.getOrElse(0), htlcMinimumMsat = localParams.htlcMinimum, @@ -424,7 +424,7 @@ trait ChannelOpenSingleFunder extends FundingHandlers with ErrorHandlers { val scidForChannelUpdate = Helpers.scidForChannelUpdate(channelAnnouncement_opt = None, shortIds1) log.info("using shortChannelId={} for initial channel_update", scidForChannelUpdate) val relayFees = getRelayFees(nodeParams, remoteNodeId, d.commitments) - val initialChannelUpdate = Announcements.makeChannelUpdate(nodeParams.chainHash, nodeParams.privateKey, remoteNodeId, scidForChannelUpdate, nodeParams.channelConf.expiryDelta, d.commitments.remoteParams.htlcMinimum, relayFees.feeBase, relayFees.feeProportionalMillionths, d.commitments.capacity.toMilliSatoshi, enable = Helpers.aboveReserve(d.commitments)) + val initialChannelUpdate = Announcements.makeChannelUpdate(nodeParams.chainHash, nodeParams.privateKey, remoteNodeId, scidForChannelUpdate, nodeParams.channelConf.expiryDelta, d.commitments.remoteParams.htlcMinimum, relayFees.feeBase, relayFees.feeProportionalMillionths, d.commitments.maxHtlcAmount, enable = Helpers.aboveReserve(d.commitments)) // we need to periodically re-send channel updates, otherwise channel will be considered stale and get pruned by network context.system.scheduler.scheduleWithFixedDelay(initialDelay = REFRESH_CHANNEL_UPDATE_INTERVAL, delay = REFRESH_CHANNEL_UPDATE_INTERVAL, receiver = self, message = BroadcastChannelUpdate(PeriodicRefresh)) // used to get the final shortChannelId, used in announcements (if minDepth >= ANNOUNCEMENTS_MINCONF this event will fire instantly) diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/io/Peer.scala b/eclair-core/src/main/scala/fr/acinq/eclair/io/Peer.scala index 437767420b..b9bfb51dae 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/io/Peer.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/io/Peer.scala @@ -532,7 +532,7 @@ object Peer { nodeParams.nodeId, nodeParams.channelKeyManager.newFundingKeyPath(isInitiator), // we make sure that initiator and non-initiator key paths end differently dustLimit = nodeParams.channelConf.dustLimit, - maxHtlcValueInFlightMsat = nodeParams.channelConf.maxHtlcValueInFlightMsat, + maxHtlcValueInFlightMsat = nodeParams.channelConf.maxHtlcValueInFlightMsat.min(fundingAmount), requestedChannelReserve_opt = Some((fundingAmount * nodeParams.channelConf.reserveToFundingRatio).max(nodeParams.channelConf.dustLimit)), // BOLT #2: make sure that our reserve is above our dust limit htlcMinimum = nodeParams.channelConf.htlcMinimum, toSelfDelay = nodeParams.channelConf.toRemoteDelay, // we choose their delay diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/payment/relay/ChannelRelay.scala b/eclair-core/src/main/scala/fr/acinq/eclair/payment/relay/ChannelRelay.scala index 3475b97f74..cec325e1df 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/payment/relay/ChannelRelay.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/payment/relay/ChannelRelay.scala @@ -69,6 +69,9 @@ object ChannelRelay { case (_: ExpiryTooBig, _) => ExpiryTooFar case (_: InsufficientFunds, Some(channelUpdate)) => TemporaryChannelFailure(channelUpdate) case (_: TooManyAcceptedHtlcs, Some(channelUpdate)) => TemporaryChannelFailure(channelUpdate) + case (_: HtlcValueTooHighInFlight, Some(channelUpdate)) => TemporaryChannelFailure(channelUpdate) + case (_: LocalDustHtlcExposureTooHigh, Some(channelUpdate)) => TemporaryChannelFailure(channelUpdate) + case (_: RemoteDustHtlcExposureTooHigh, Some(channelUpdate)) => TemporaryChannelFailure(channelUpdate) case (_: FeerateTooDifferent, Some(channelUpdate)) => TemporaryChannelFailure(channelUpdate) case (_: ChannelUnavailable, Some(channelUpdate)) if !channelUpdate.channelFlags.isEnabled => ChannelDisabled(channelUpdate.messageFlags, channelUpdate.channelFlags, channelUpdate) case (_: ChannelUnavailable, None) => PermanentChannelFailure 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 c67fe3573d..862e998c00 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 @@ -67,7 +67,7 @@ private[channel] object ChannelCodecs0 { ("nodeId" | publicKey) :: ("channelPath" | keyPathCodec) :: ("dustLimit" | satoshi) :: - ("maxHtlcValueInFlightMsat" | uint64) :: + ("maxHtlcValueInFlightMsat" | millisatoshi) :: ("channelReserve" | conditional(included = true, satoshi)) :: ("htlcMinimum" | millisatoshi) :: ("toSelfDelay" | cltvExpiryDelta) :: 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 97be45a049..18da312a13 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 @@ -54,7 +54,7 @@ private[channel] object ChannelCodecs1 { ("nodeId" | publicKey) :: ("channelPath" | keyPathCodec) :: ("dustLimit" | satoshi) :: - ("maxHtlcValueInFlightMsat" | uint64) :: + ("maxHtlcValueInFlightMsat" | millisatoshi) :: ("channelReserve" | conditional(included = true, satoshi)) :: ("htlcMinimum" | millisatoshi) :: ("toSelfDelay" | cltvExpiryDelta) :: 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 fb132d33ba..f01fa00cfd 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 @@ -54,7 +54,7 @@ private[channel] object ChannelCodecs2 { ("nodeId" | publicKey) :: ("channelPath" | keyPathCodec) :: ("dustLimit" | satoshi) :: - ("maxHtlcValueInFlightMsat" | uint64) :: + ("maxHtlcValueInFlightMsat" | millisatoshi) :: ("channelReserve" | conditional(included = true, satoshi)) :: ("htlcMinimum" | millisatoshi) :: ("toSelfDelay" | cltvExpiryDelta) :: 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 index 822e224116..352b9cc97a 100644 --- 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 @@ -74,7 +74,7 @@ private[channel] object ChannelCodecs3 { ("nodeId" | publicKey) :: ("channelPath" | keyPathCodec) :: ("dustLimit" | satoshi) :: - ("maxHtlcValueInFlightMsat" | uint64) :: + ("maxHtlcValueInFlightMsat" | millisatoshi) :: ("channelReserve" | conditional(!channelFeatures.hasFeature(Features.DualFunding), satoshi)) :: ("htlcMinimum" | millisatoshi) :: ("toSelfDelay" | cltvExpiryDelta) :: diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/TestConstants.scala b/eclair-core/src/test/scala/fr/acinq/eclair/TestConstants.scala index a0429479a7..cb7c05fda7 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/TestConstants.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/TestConstants.scala @@ -102,7 +102,7 @@ object TestConstants { channelConf = ChannelConf( dustLimit = 1100 sat, maxRemoteDustLimit = 1500 sat, - maxHtlcValueInFlightMsat = UInt64(500000000), + maxHtlcValueInFlightMsat = 500_000_000 msat, maxAcceptedHtlcs = 100, expiryDelta = CltvExpiryDelta(144), fulfillSafetyBeforeTimeout = CltvExpiryDelta(6), @@ -243,7 +243,7 @@ object TestConstants { channelConf = ChannelConf( dustLimit = 1000 sat, maxRemoteDustLimit = 1500 sat, - maxHtlcValueInFlightMsat = UInt64.MaxValue, // Bob has no limit on the combined max value of in-flight htlcs + maxHtlcValueInFlightMsat = Long.MaxValue.msat, // Bob has no limit on the combined max value of in-flight htlcs maxAcceptedHtlcs = 30, expiryDelta = CltvExpiryDelta(144), fulfillSafetyBeforeTimeout = CltvExpiryDelta(6), 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 d18261043f..47efa9afb4 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 @@ -480,7 +480,7 @@ class CommitmentsSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with object CommitmentsSpec { def makeCommitments(toLocal: MilliSatoshi, toRemote: MilliSatoshi, feeRatePerKw: FeeratePerKw = FeeratePerKw(0 sat), dustLimit: Satoshi = 0 sat, isInitiator: Boolean = true, announceChannel: Boolean = true): Commitments = { - val localParams = LocalParams(randomKey().publicKey, DeterministicWallet.KeyPath(Seq(42L)), dustLimit, UInt64.MaxValue, None, 1 msat, CltvExpiryDelta(144), 50, isInitiator, ByteVector.empty, None, Features.empty) + val localParams = LocalParams(randomKey().publicKey, DeterministicWallet.KeyPath(Seq(42L)), dustLimit, Long.MaxValue.msat, None, 1 msat, CltvExpiryDelta(144), 50, isInitiator, ByteVector.empty, None, Features.empty) val remoteParams = RemoteParams(randomKey().publicKey, dustLimit, UInt64.MaxValue, None, 1 msat, CltvExpiryDelta(144), 50, randomKey().publicKey, randomKey().publicKey, randomKey().publicKey, randomKey().publicKey, randomKey().publicKey, Features.empty, None) val commitmentInput = Funding.makeFundingInputInfo(randomBytes32(), 0, (toLocal + toRemote).truncateToSatoshi, randomKey().publicKey, remoteParams.fundingPubKey) Commitments( @@ -503,7 +503,7 @@ object CommitmentsSpec { } def makeCommitments(toLocal: MilliSatoshi, toRemote: MilliSatoshi, localNodeId: PublicKey, remoteNodeId: PublicKey, announceChannel: Boolean): Commitments = { - val localParams = LocalParams(localNodeId, DeterministicWallet.KeyPath(Seq(42L)), 0 sat, UInt64.MaxValue, None, 1 msat, CltvExpiryDelta(144), 50, isInitiator = true, ByteVector.empty, None, Features.empty) + val localParams = LocalParams(localNodeId, DeterministicWallet.KeyPath(Seq(42L)), 0 sat, Long.MaxValue.msat, None, 1 msat, CltvExpiryDelta(144), 50, isInitiator = true, ByteVector.empty, None, Features.empty) val remoteParams = RemoteParams(remoteNodeId, 0 sat, UInt64.MaxValue, None, 1 msat, CltvExpiryDelta(144), 50, randomKey().publicKey, randomKey().publicKey, randomKey().publicKey, randomKey().publicKey, randomKey().publicKey, Features.empty, None) val commitmentInput = Funding.makeFundingInputInfo(randomBytes32(), 0, (toLocal + toRemote).truncateToSatoshi, randomKey().publicKey, remoteParams.fundingPubKey) Commitments( diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/ChannelStateTestsHelperMethods.scala b/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/ChannelStateTestsHelperMethods.scala index 5f279ef20a..2670b9f7fb 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/ChannelStateTestsHelperMethods.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/ChannelStateTestsHelperMethods.scala @@ -187,14 +187,14 @@ trait ChannelStateTestsBase extends Assertions with Eventually { val aliceParams = Alice.channelParams .modify(_.initFeatures).setTo(aliceInitFeatures) .modify(_.walletStaticPaymentBasepoint).setToIf(channelType.paysDirectlyToWallet)(Some(Await.result(wallet.getReceivePubkey(), 10 seconds))) - .modify(_.maxHtlcValueInFlightMsat).setToIf(tags.contains(ChannelStateTestsTags.NoMaxHtlcValueInFlight))(UInt64.MaxValue) - .modify(_.maxHtlcValueInFlightMsat).setToIf(tags.contains(ChannelStateTestsTags.AliceLowMaxHtlcValueInFlight))(UInt64(150000000)) + .modify(_.maxHtlcValueInFlightMsat).setToIf(tags.contains(ChannelStateTestsTags.NoMaxHtlcValueInFlight))(Long.MaxValue.msat) + .modify(_.maxHtlcValueInFlightMsat).setToIf(tags.contains(ChannelStateTestsTags.AliceLowMaxHtlcValueInFlight))(150_000_000 msat) .modify(_.dustLimit).setToIf(tags.contains(ChannelStateTestsTags.HighDustLimitDifferenceAliceBob))(5000 sat) .modify(_.dustLimit).setToIf(tags.contains(ChannelStateTestsTags.HighDustLimitDifferenceBobAlice))(1000 sat) val bobParams = Bob.channelParams .modify(_.initFeatures).setTo(bobInitFeatures) .modify(_.walletStaticPaymentBasepoint).setToIf(channelType.paysDirectlyToWallet)(Some(Await.result(wallet.getReceivePubkey(), 10 seconds))) - .modify(_.maxHtlcValueInFlightMsat).setToIf(tags.contains(ChannelStateTestsTags.NoMaxHtlcValueInFlight))(UInt64.MaxValue) + .modify(_.maxHtlcValueInFlightMsat).setToIf(tags.contains(ChannelStateTestsTags.NoMaxHtlcValueInFlight))(Long.MaxValue.msat) .modify(_.dustLimit).setToIf(tags.contains(ChannelStateTestsTags.HighDustLimitDifferenceAliceBob))(1000 sat) .modify(_.dustLimit).setToIf(tags.contains(ChannelStateTestsTags.HighDustLimitDifferenceBobAlice))(5000 sat) 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 8ff235ff85..164b5fc21b 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 @@ -302,7 +302,7 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with import f._ val sender = TestProbe() val initialState = bob.stateData.asInstanceOf[DATA_NORMAL] - assert(initialState.commitments.localParams.maxHtlcValueInFlightMsat == UInt64.MaxValue) + assert(initialState.commitments.localParams.maxHtlcValueInFlightMsat == initialState.commitments.capacity.toMilliSatoshi) assert(initialState.commitments.remoteParams.maxHtlcValueInFlightMsat == UInt64(150000000)) val add = CMD_ADD_HTLC(sender.ref, 151000000 msat, randomBytes32(), CltvExpiryDelta(144).toCltvExpiry(currentBlockHeight), TestConstants.emptyOnionPacket, localOrigin(sender.ref)) bob ! add @@ -315,7 +315,7 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with import f._ val sender = TestProbe() val initialState = bob.stateData.asInstanceOf[DATA_NORMAL] - assert(initialState.commitments.localParams.maxHtlcValueInFlightMsat == UInt64.MaxValue) + assert(initialState.commitments.localParams.maxHtlcValueInFlightMsat == initialState.commitments.capacity.toMilliSatoshi) assert(initialState.commitments.remoteParams.maxHtlcValueInFlightMsat == UInt64(150000000)) val add = CMD_ADD_HTLC(sender.ref, 75500000 msat, randomBytes32(), CltvExpiryDelta(144).toCltvExpiry(currentBlockHeight), TestConstants.emptyOnionPacket, localOrigin(sender.ref)) bob ! add @@ -332,8 +332,8 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with import f._ val sender = TestProbe() val initialState = alice.stateData.asInstanceOf[DATA_NORMAL] - assert(initialState.commitments.localParams.maxHtlcValueInFlightMsat == UInt64(150000000)) - assert(initialState.commitments.remoteParams.maxHtlcValueInFlightMsat == UInt64.MaxValue) + assert(initialState.commitments.localParams.maxHtlcValueInFlightMsat == 150000000.msat) + assert(initialState.commitments.remoteParams.maxHtlcValueInFlightMsat == UInt64(initialState.commitments.capacity.toMilliSatoshi.toLong)) val add = CMD_ADD_HTLC(sender.ref, 151000000 msat, randomBytes32(), CltvExpiryDelta(144).toCltvExpiry(currentBlockHeight), TestConstants.emptyOnionPacket, localOrigin(sender.ref)) alice ! add val error = HtlcValueTooHighInFlight(channelId(alice), maximum = 150000000, actual = 151000000 msat) diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/json/JsonSerializersSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/json/JsonSerializersSpec.scala index 0249b9a53f..a5ceb9dad8 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/json/JsonSerializersSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/json/JsonSerializersSpec.scala @@ -271,17 +271,14 @@ class JsonSerializersSpec extends AnyFunSuite with Matchers { test("type hints on channel data") { val dataNormal = hex"0100220000000103af0ed6052cf28d670665549bc86f4b721c9fdb309d40c58f5811f63966e005d000094a9267a1f2b86e492dacf939afd1561a0e42ed248d1a09f711204c176fef1b0f80000001000000000000044c0000000008f0d1800000000000002710000000000000000000900064ff16001429acc00c77e6894e41e417ae712e557d7bba1c460000186b0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028a82039dc0e0b1d25905e44fdf6f8e89755a5e219685840d0bc1d28d3308f9628a358500000000000003e8ffffffffffffffff0000000000004e2000000000000003e80090001e0252a01d9d8b03db1a99b1a82223f7dd60ecffa69dbef47c06228fdea2fe0f021503c2a3cb942c336afbe484a00452f5b027378e2124c7ea452f05c26ab89591c18f03019eec506c69765552b397d706dd276f0718c82e0a49224fbaccfad75f81b2f502d3d560591f03da622f338b0988bbf0f612fafa4f1b22ed51398cf7a07c5f4192025d67e71808e128eb21c82881cef04a510067a50d0f61f2f455bcfb7e168ae7ad00000003028a820000000000000000010007fffd05aa5d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee000000000000000000000000000493e0f81fd474bea478df0202b311c69e85dc6215f629491dd15ad0929faae2535abb00061b10000370b2714d2734e6b8cde085794dd7b41c8a9b6c03c1edd8e3db168ee7fce39493596e882b18b5b1b79c16400c6762b9856075821be6be9fab8f469f56820d8f341554400a8da7f1f1a8501902581d43b9fa6e5c68015716f718a2190b87fce41bf1b509aa61806394a42489d63c457fe4c79e7480eced1315edd731887e57704fc9102f50cb7f0d242d755cfd5a2172dbaf7f01b124861cc6d1dc804796bbb84165c805f0c0f3fb9ec97b74c2a694de56a9cf8d79d1a679260ee1169d78214b34c8a654ba22e59ddcd32beff4713de33549f035b342660405b0159a7a508e5691ef4805689140e72b8a0ef2e61be74dea5d0b8f5589e0e373cac2e2e1cc39b2121c05cf4122ad0f8b9af6fbf1de2ea26376c2650ccd306c13a7b64acbf2a3feed128754abe44658009e642768ae3d84f5e0fa5f7f360c2a1c76d26985817ae77b71fb59014a5483ebba9271cafa5e5d8031c569adeceb8bae6444e98d2522b28f6682109fc7d31cdb83ebd45e5d81e7f046df42345b49f470dbef9ed87709301d2c6131215d33a30b8d18e63e54a2aff85dd57672f8198bca6a67ee147c7d0ae649e5661ab6bf78a662fef9a164f1e332b9f16e6fb3d5769ddcbc1d1c07338d3394b9245d17618c2474e86c064fca4df00ad3a93dc051fd8c3328cde2a987798b0f22a21c90426700abeb1e6f38dffb485b5477ec44c690fa80e317b32a982fd3082253bba8595783290dbffee4fc9296ffdf16a8bf3154971bb720e78674969e9db2e0fbab9e9e13f24bc8b3af5e2f00f262f0da56de443f70398ab68f747d35370fcd8e1c0e130f7269e08f862b5a67f2c129be254df2358762ce3a947eb27d66450af51540e7721b47c8a5a86098ea64dad381f14e07aabbbc470949a99c07612add3ab4c575fe2e520bbe511a1a674aea37a44535c13ee3380f8f39bd230fc1481cd31912af36c6751e23c6f383cd37a8b13fa7df9f0c7e460739f2c6226638ee14f14d36366211cbc6a1e16b4856bf302a540aa9d9e833b1d59c510473096384c8b450f2f3f1dab9e614af822949d5cc93d76bc4d1a52891bc85f1981ef83161195ab7d8181ee4fb163bc6c685a10e87c7f4b15ed7d05833c230a4a5b63841fc65b959f0ff010e697f47c583f9b7fa9b389c0eff6614e47d85b83c483136f182be4c151d272f5d938b912a95e47d333e5de6a409ad271679a778a7eb3f169c71525302fac5d4575e2645c09763c2ef165736a7a726ca605038e2781404328790ffaacef2b9c2bf90122042cd571287bc4e3973da65fbd4e3da9e40e4347ca6eb4ef1ffef4e5a34be80425cae3e81533f7f2953f95fca53a22057a39125f5c76350fba7fc6c036838fb951d0aa8702e7f44c6f8a9cbce3b64fa8ddc2bb8c8b35d1e29a21beda6fdd332b31a749321455277231fd9d70ea4aded95053b395f88fa6916d126e1626fc0f1be6cd2a9538d17c498b40927f12b3bb40fa3e272e82cd2242b670afefa387470f4e6e0a1236028954c9e90311f486617187956a23b90b356d71e219e6dd055c2120771003a6c12769aa3ceacb9642bc01022731ca7a413b68ee7d1d5444f75dfa51a68b74a01ac85f6ceaf5e56987b9d67d6de896f5aafd25c78c413a6d4b5b03d571167524cd231ba13bd9f80fd7413faf21e8170cef0d08b242c5c38a2b0158da56e358ba0692f670d4611c7a3624b234adc30c5b7198e0afc941f5d13eae3a94ddffa652c784c34c582e04e948da91a5ac3038a9df38fd4f1733779f4f122ca2d7ff9d03bac9def35d9ee3a183161f8f2808d472b2e64581209359cea58ca7757164c666029982223877e2b14d2d537afb012f1ffc12cd083c16dfc64213c56f3d4d22b603d3dfab1d21e239d6fc1f9f153ed61f1ac91c29c85c16f4aa2985f84052f5a08d32bdd00fd05aa5d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee00000000000000000000000002faf08011b29e60a38883a8d4434f17ca3d92161109f7ddd8799e64e86d6b8509babd1100061b100003b8c1771721551fa88af8fdde92909add6e5b8fa90a4b0484ee065ed3ed7c56e733a7fcd775d4ab92956c1328ffee9c195004c5dee5dd5b9d0f9034589e6769e72579d3d5837ad70785ec420b4a24c04d36668728c0d2534ff1feea9aac2410423fd79c7db9231ee7efd3d585646e378fe53d731d18f38d6356a970f5c3026edc849d49ff34e58dfb7548512461110088ac3aa800e10785029ba3b0e9ab7bde0f056939e4921792dba2f5c005135daf57e32cae06a9ccb1b4d321f3ba015e5b92def1ff1c200e56b3990d82570586bfae26e9398e17dc6c069f92d80e6dfedf6b2f24b1dc3cc9d63e684d861f40fdbf508d4ac34b7f10c57be2a9b0c5921f86869c29ada5394b8780d2488a4fca3cd98ddb0ff8ea4415a07caea436682835744e94d5cff6d3024a9525dbd697e499b7ef23062b18b225bfaa4c5bb07166f34ff7866ec8f0fbbc12f695c609692798364fa20bf7977e321deda3fe5510833494532fba94fc1f0dd14ec74f3e9fe8ee659634621b63d16d46a8958132c24bd82c516bdf9ae9515cebae42778e4de6be7047c31cf86c0df0306f7b6562e1f35be51e5e64cc6d9d4c010849e6ac7ddacaa4b7b6fb1d35aac815964090940e73a1193eece11c1c1d37e373ef58c5e2d690b6ed6338360af9906146da9db8329bd2786bbf92df10445ee093f0b1b2a640cc2daf003fa7141435ba1dd54f9cdbf5417fa7f539b255452852a85d2ce97ce5abed4980e7b409e283f97ccc9c01e104b55155f96ace6789f61c4661962d34fc5d7e6f5f5233180933b2fa7f7a5b074714645489f5221966160946b7bfbf0fe6733e6beb8af4457b9d36cde1200811009ec483a9d730ca980aa28f636942af5e89794a8edbc1b75d555ba134974374d0fe23d31c26566064eb9998d649bb2bf066bf710da50672f4e3ab4df843a0c8942bad0a071c237d4c1759eca37380919e36aec73284db202a32d3d1619f3e5b757b2df8b04bde567783dc8e465d996799782f1a1b8de9331681a35aa04edb427de87264c8ae9c397f29d3e8730db91256425a10b960a9de1a48d0d4186d617d2b69c87e2540f6570faff4ee1f6303d7d281434947abeaad83c86a4d25bef4de2bb3c6104aa0ceed7c8df039f4be6a42851a118adb1b8f98e02f6727b75d98541bab2ff24fb2f20342e86150c678941825409b62a844f44ca1ccdf0d9f7c2cf9b222fbed00bc92be0802fbfbbeefa71c8976cba8fc4aeb031480f434027b1cd593d08cbc14c2a360b736b06b5afb8da35f0be3818fff4275b8c830f5248a8b8edea1327454e1360bd90d4fa08e965f459b0b027e1180290cf762f813a31e8109f472d9657b03af737d1f7bd2e59441541a84ba818f1413c5cd1f8b9882e9188e0def9e44e2f4a7c710c893c7188ba86423f8ae86068d84e1832af548289e87c34d68b186df7e24ca5b051f8f5e4a44e2e7383ba2a09615b4147b34e86486731290ea67f3be24c13a9c5cc37f06555989b3f10c580a9cd2b416d0ee4210855c6833a25996761dfabb036f3893cff7db7e310baa8faa79f46e0ee43bf4dfd732eae7f44bad2e7c032b9c6d14947af6b0e37e5ec98372a622f716ffba0cde04b9d4508392dd154ddc34829412bfa604d4f00e4b10a553587343ef5c0944165e7ee1e34387b09c147ecba943cf36dbc4269efe50ec3a5a3075c43be9651d6db6acb9f657476952b78c990557f05935247a71077373ec436ec586def177448f8859ba096b7a838e5b4ce7a463f9082f705c26d99936eb1be584ea9b58a44b9b4faa07fd8247fa66cf4529d1b8cdb92ed7bd96bf0968db4376489c7d46f0f27d58ac884c29736502953723ef1ab41e19c7041d3e0e9091d7de2e3904d032de02292edb1225a672ab438d3c65f7921c06a9f181f8ffda4ac524d0e000fd05aa5d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee000000000000000200000000000f4240657c0bd97e795218aa623b27cf9a71764379c4762fcee8993aa0b1ab1e32194a00061b100002c0ec5d388a8c78491bbd870faa2c46e4282e11796123b69c2792e5806748ef068397f0212a33e3f79162ba4ea247ccec410db039dd323af48ac27bd0ba77ecb870c587477d4543d9a29c53fc02bc98d7cd0144c7abf80b999c22b42a28ae8d625478ca304001f9a49782ec970031e673c76e4e27357a321729d6df38d1d88dcbf764c69eda3baac9739bed637010f44638cfe1deecc56b76f6e02d1d0c3f104462b9ffa5f20de4cf092d86a5bb35d5f62b0fb1c983a2c06df17c9ffc809c83e4b4335f5903fab536fbd9719847bb063541ecbe05c12ef8d058b3547faca054e3d662250f1cc1f925dd71297abc25fe37ab33a086759fac76208a64552f84d2e4d84daccdc3aa2bbd2c2f922bf262596742dfe034529d1ead2975dd3d197ab0e2e1c75c8b8f160ca6077638022d4afbd107979949cf342cb399347f3990029f0db6d9ac0c569d61d42539371f9a7ff59e9c83ff97d15bf0eeb254ae58fb7b1f9d8710c546ac8a227930c66ac841bc4f475229e5cadd14ba5a01e6b2da99c55861a08e2100e62c4499d30003fe30ddaa347d7a27c2158d3787d58fe51ae57d797bbef7f900508d1580df3e5233f0887567fba1faa918c246d2ec5c3b7aa022cb8a652d00b4d719e312482f57655eee80a90cdc73151fd7ab9c5367793d60c6088fab98f0547d7f547e10db202a25e027a5cd0abc41bb0e3ef563c0a6d469a702b2a26f0e8b4fddb845a16a5f06b9dee33c3adb31430c94942c5023179d3e4441948a332069a1c3b69dca65f05a43452e42fd28a2f7e6344f98ab9a7e4eece3c1709be1f7bb620f8b6c45989a8bccad39a4bf40e8215183d1449196f1f9fc17de778b616856152e6e6145a1b7a3d7f226becaea5ebe34aa4bd06e60f0fed207bfd21f5663bfadd37dd722437bcd46a26fb4e19d062574a81bcd817eecbc1914a5878809128961acdd73113ae9c51070ff4494e16d81ccec777eeb513da82bf43d4884812b26546b4370dc315793271b069f60f4285f648cf122ed8b22b0c7a27e94ccd59a273eb774c109e19980e146850de95f82cdd8aa0e82022672024c917b281422d284df0ee0bdeb3d4ac56b4ca675ebdb835c17b6a822d79ae7310f4aa41d80ac61c5e45c1c0e1d64542622a31091a9f87c335e86d964dd85a951d7c9bf41c9f2b1a9bb8424d7d1b26413da8034182fa42d2b1cd1f8745482c49d8348d19c72cf5a02bd28e4cba82128af8bf5d9c1215c4f543ef4d185f100f8d803dfa29c300c072e44ad9542b82fb1380d55c15c9a4b4398876e2450b90b49990746f339abca8cc8a462b62329a128758ce0e46b5f998af1bb485a3044bd125424eb5c623afd2a11befe4ec544eafe275ed1ad82b940dad5e9a9710d48562e51b296ba81f2d70593685ba0e3f3b25089a187e61d5675dd481aa99620276cb0a841a3c4df201a929287b1127270c5d25d06fb286dae1a9a5a5cdb60003f0c30d2021074bf252e550685f7b51a087a77b0871e883104e55f898aa5bc4cf8538c293253a737556d7f220e15b90cf0eda7d5f2172372e3c50c12cc588f312da37191b5038e944825044b130bff281ecd47a4252a1411ab7a9305c2b37e9facd435e9c434de37641498f8e4bfa7b42966da29c84200aca87ea1c3b00db54906b340e524a7dc4a15403bb82bc24517cb91026096bdf18f5f7ae5640ed6de1f0c5d184813d6b9d244b32b58e9ff524741a39383eec3a530d60db13deb26e3523a725f0599b671b625c07002704fb600b77318417d2527537359d122e22a1f7581eaebdc19e65ba50bdda18ae08e9a8694fcb0ff1a2cd98d910dbcd52064c15a4282d67b278c72a0fdbf228abf6b519dd28ac21c57d1da4bb7ad5b5ab10da6b83132df1da79ccfc77fb45598bbd91ef5ab96d8a2ee148639a562debafffd05aa5d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee00000000000000010000000002faf080ab009f4d0b317a141e5b3f865599676f895834400b66dd09d33ad27163ca176f00061b1000028fe56ab181f454372c939ca0516f5782b26cec2010885c70e55c41a1e43de3af6635d2ed0bed90837cefa9f1805f4808e8092a4d44efe5fb616ff7678487a460b367134fcc728ba273fb1d22718bc6a95e47a120a6d952c7c2cb8f38e59c2a4efa63977cced7e4b8f46e4d47d29098a73beee807c3337c4acddcbb32b78eddbd124b2f33ec6cd8bdd364aa4ad2c10eb69dab808fe5f5f0aec19750e51ac65a8746f345c05d4b8823ffbeadd6200ad01449c39a008fbe117a8ee904445488811336d0c439419fa4f285f9f62a34f10b076c99c0092968e3cc9fa656016b6da049bd56b910d7a9356e76d24e746b280f0275ec9e9bace82d852bf0a137ea02d4cbd3b68450bfb593564d8c20953bb758890a55a8c381a4b3303b61ec26a56111361bf7262b3f6f2503aad06758130d86ea607cdbba53415aaf253430d92fdd81c685ab39233e94654e6508eec1347747e2df2862169382aef6f99dd78b50629c5d98b1fcc73e865679d862b42f8e9d54ef6288ed2c3f2713f0fa4db538cd3e70ec1a30cd65dbf873f581b30892acedacd39b5f0aa774d1f3f77d8fd11ed628bcd02ac33f89123595aa455ec54a07e93e26f94338fedd8bb84094a0add52f912ed5f9019e3a28d90d251cc6ed7ffd35254dcadd9f1e9b28eb0e06fd4fe961d60cb690a7757f475c08aef07c2e54668121540a42a9c779623709a2124629e8c4bd4021763979647f625b360a4559dfd3f57798dfe5d36e9d902904af3ed67d8f4b0894538c7718f5160d211cec27375a7e6a2ec42f2c8fcd1c953b7b8379d42439a2c6b921a66d5102ceb6bd6bc20b17098e69a0a4f708b42520e4792474c3d115a12c83ef60ac6e69d8842c5981e9a6d178efa352e73e4a34bed4fb590dbeecb259617668e6ffb9f955297f26e3a6a3b95d9617529a61f08666ca1069d2ee1876337d3e786244c5bb45a8236577184584cf3018118d7e4e78973ee510b6773bd922797e580cd240dea3ca31892d23c1e6e4fa92f1a01da8ea40044f5613a9429ebe7906f79b32636204d025115810b376d4c6436da136b96c7c10649e3290caecd6ca14d995a817e3725fee7e621c5366f80c752e50aeffee1af3361924f31cbb1cb44731d19963ff30127ca2363ce15e50948be14c43400737ee8910ed06027599da74b06e77eb82ac523cc031c57c02dd82dbc0d53629d072615c92034cf829e7a5d4437b1f58e2bd4b16993e1e1b05c26ed8d695351db11d21df36a7f5811ef5fe001ab1e1c6ce9d2b69b6ac3af8087e6666317f75b645e3b1caefac0eb65327fcb9fa62be341c99f191cc869e48dbc8fee3e42d4393cbc6505c880dd6739a69be4f7ef3de306480a7a51f413d310926f252ea96a0c772d8b8e94e7d6cedbfbdb21fae2ffc379eb17c2680fa2bc56a8726c93e7bf2d446221ce95e49da93d29bec8e53ddcfd262c33d556c2b8921c3de93236408b462d28612d3343fbb9cc538b1e6b33c341c3b91dd41f936931e61f146fd00aee1c5c0de97b47cf7efce889012e1c22dd8faf0fe155f4e9930c27941d8b0907502a835bfffff801f6835de69ad33e95232f773219eec0e2374c421230f323257dbc91629c4ca8a61584f737b827fe8e8f5b69b88a7b64b362f8142b043f08ea82c4a0ab7c4e0b9805533e806f90597095242ff64f314801fb7ad838e98e1859b2c05c9b027ae5a4baf780d15977bc1492dee9b14b1cb0fb3243eb2304919486fcde89a3cf35a64e31b1698e35fbb8528a73526a19189d406272b8becec94379f69372afa99d06bb4f34df72e1c3b49557855ae8ac265160bdf48ab34cde30d2665891cfeda24adcc657d851431f38953f917f1a111f023d2c71845ccf25a562d2450bf8b4986b64ae4fd09e5a8ab9610d11fd68e9d570b3a467780236de974c7fffd05aa5d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee000000000000000200000000003d0900559bb949364ed92a64f449cd6ee3eaba2e607595d3cecb36b06b145baaa69bc000061b100002860fd058656f185036e81a64fe19034d29223d3620bdf4bf2ff3c1def9c6bdd70c2cda7f660e1b202672741bc3258b04fb755fbbb1350261e7992bce930e256bd5d8d4fde61365b7b24904b788ef2040fdd6eb87f97c2d2f29eab4291d9a28b5da306f28b98d01d93517b203a028199d423a3545aa17522c63247f73af7b63335b0b48e4b875c69b42f4cb1573bb3e5fd68837f90c50b0161f067a9eafd9a0790e53ed5053ce60ffff410e4b16a4b7bc5a52c57e78ef266100c9f79753f81878c08e5dbd4d80c6e46a339578d8ac8c572df77ef614800cedc460c06878c0da97908067729ed35e3afe919071724f89ab736f5791a9c9b5d422136332213434c836e2ceb9fce0e2e96a9a6d7befe8c132867d5fafea1a7809ddd6b3a89c8ef6ea83028d3e2cca00f1bc6e12ea8b67e91a98acaa2edebaf6dd3a18c655b6b1fbbff5c641f8002780758d05f1f39c9470a124a5add314abd2262142733120747cda2f1d9eb90d68ecb9c7fbab23d73a35f2a20a2a365de6cd678d53bd5bd9bd518333d04e8e678b5d08f028982dad08c80be7d8fbb0638dd814232224c687f8321baf96ed8b39a1e9ab52dfd69d8eed79ac3f5a2c480a585bff038c92b367743317b937d969cdd533ae1d797a789ff7994f86a0d6cae470b64ebddbc478573af347a110dd1feaaeb4779441ec439cfdbafaba870105efd86b9d85a4df7ddb9b09f5b6b4144cd1fad5932df37ebf19a62648659fc1969142310a5cc9b4d0c48ba6bb0f863ed53a0b75fe1ee6515a46993f95be2e34166408b54a43e55c4802b37ac902fb4c8367ce38990d07ed3104d0728d327d3b9de6452b520f9af534505885788109ec78c1176ca0864d28422e826cc83f821b7eaf028d6a7e350b3037d0fe58d1d4e18113c8f61913932e71c0f334402534d8663f15445f900fb9dc6b3a93223868167be26fcbd70c0459eee37f81fd539c319eb0b04bd478b94b5f4cd23b4d496c2bdd6e8a154fd76c4ecbdf7647fe9e7be88c6a3a8e7696e2e596dfc25ba798db6ca331d135e9ce7c0aab9721d3f70ca53354f96ecd028236259b9b0d9e0bbf73c8e841b1d4276214f7be8feb525c91d39910b0e091997a2b89e945806e93cd325cb51463b0729f1a519334038cba09653799ef533a49e812e86b81af7e5099a02ca11c2b17dfc8b9e51a57a20546f2c92826676ebcb4f64fe7cc77424388dfec7199179cb125bb4613c8bf05edc4173987d7d5ae0fcbfa08a1e5ea2d6b01406d740b49c5b1a68da585549590c3ec13479efa3136c5ade68057fe173ace55593ceca8440372b03f332969866d1bfbce3fe9dd907d27593b8b2ad25eb4b12afd0f3abe7931ba7789c84a3ed65a03df06d998a9956043a4de786c359bdd58f0b9e5cfc32bc709b626ce8e63f3997a0e9f784f6b94e342b4710553e805cc8399191254189058ec75a15556467b2456d9b38a7e4d15cf59727ad2c32f0daaef1748be04311ff484479eb31f7eff9e32b816fa40f40430e801c15e931294b39ec4d6c93e8130fb4a1b53ca6471886a33b10b46d6973d02bbe3b39345e121473ea4ba41f3cfced07c3a613393e38b8ca01c353ccab96128093bb5fd000978b11ae6f7c1fedf48c3682119d1b44629d02ea3800d2e247ef1e78e527e5d574b4dd144e1fe1b0c6551442d419baba300258657792947443747b29b6fb9417d3c57536de6aa379c02f3addbd2066554189ca817c7f57331c972c30e3ed06fc7e521b8e2bb57c023dff9816f260a153f1ffd55df2a2fae568f3dc734d62ab47a77c54772b5e4cf2758c912cb473ec372173d9eda0c58b103ab12d11dcb976a40816ecfa8b9c9384f6415017555933652e77ae20e14ea9ac25b5811fc03364c4883bb78c82e29f8a8892415ff652b782642bf6036b3e2200e00fd05aa5d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee000000000000000100000000007a1200ffb841fb291ecf09ae7b5dcec1feeb45ba196ca02d6b9e50ae2b3dcd9ca5d72500061b100003acd0a3acb9b4f9540678dc9324480bb3d4f54e5e007739c9c1d600bff75dfbbd0191e75c0a2d810a6ec5b03d02cffbf1a66123c87790e66eee8d416caf82e7ea7090a62fe14276fa88af32ab9793f7a100de5525eedf71967c13c8d361246d98b78cc74383e714f88899f34407644c14874046b3b722186015c07b8db042db955c91cb14abbf3cfa646aea81ad15bf67108a763539c64c5a8e8115d46e063e956671e8ea8d8fd638a6414d71e9b475ebe070da7faf75a898f29048ab5a2b6c7e3a72a178b8e470e8375f539ebf6284d15486c5a8774d46ea164ba2b62181f47623fd987ff5958550c962a193638679b79fcd477fdf2a09c0fa879bb22cb493fbaed27518f5cb265741535b4ab14246077ca18f11ece7aaa0e01ec5bf02c3c3b541ea08bf254df123079c1538e266dcd3161bf1b9ed41d873f1491906e1459ba51ac9dd95e783598d3c356e0cc5b98c2a96b148f55f102a9810181eedd46cd00b445d861baeeac46eba469435aa4ddc877bd68b53f4d005aa2566d356cc344aafcdc86abd774ea28cc838d2fdc541c4b6da494a96e128b8c2abab4b21b3ae2646cdcc3528ef6fd8587b3a0636ead67a62309fb003afdc14177d329b062622313e9dee912847763c68678df663a39b89c69efdb6d916d5754534bdca9030955cbcbae6fb7ff1df6282175cd37a30a904418b976af05809f0e0e7e4b4e2ec018f1e9c6bcb" ++ hex"e7a7822c8699669946f5e684671d63e68cc7c9cca2963945dc21c52232e6f83b1875b2bed7c80c37371a480a2e5255d49d390c3b2adfc695036ed91371cda7d79bdfbae464581f0b32942f03826aca17ab9da6ade4a778d310ec3da17fc3af426d21b347aee7c2db7b5e188e35714dc514e3a1c100e8595c9e0e4399ad796021976f077e5733ea535cc6daec2e371853dcb715fc366ea7d6b9a5b3509dccf5c2e1225e3a51de9f5bb9b6586b282a0b27a9ae7ae8f2be14ec677670241e384b462eecfde68957839b1327c9e5c622c0f67cdaf3845ddbe6f754401d720d6b6d5c061dc906bfa70fb76e1168c6ac1a25cabe8873c3c1e540ae44ae631a2638accd7951f368442dba7b38d0662ccb0140d1e4ca23f51de731a6f5adcf816c3235359afd607e58948da29a5f06c96b4312aee7d35ed4c2c811a58c5a196ac2f377d653d51cfccb5213c928955ac880b5fb1b91e88a52d5c217cbf78e071275fe626c230fded548b0f1667af1309149ff74c5542119d4e269fdc1b241d9f53e02e38e015b7c5c2d2ee623bcb4167e37edafddc7fadd642c20f81b454db1a3b578d527f124dbd1f3d99fdd1590256ae4e47c2e8b3bfe8708a0d5506d6ce8b130ce6b70028161454a5065e9925d75c0095dc24ba789489fa1e9236e25330ca1a45e61224ee027664f6589028a240961aff09187fb719ff3477b56427189b7b3c790b4031f6539c5e3a8a5d7fd99c2534ed1646920a43e7315bba98d59c51b337ba7a1b038006bb574df46830f96a5685e07ee8a0a41e712810faacfb231c67e69d0fc24b98d782c70e15524d5d2dcf4e64b4e26772dfa7067f6dc7ffc8b06e6ef3ecb13f927d466e0cd3a7ea09aaed90b7810bbfdcd8a1274bbe78a453ffff11ccee62059ec25955b34a1a1cdf8a3e506d99dcbadf16032646117556ad71cd93ceeec42be0350a6c9f194fea783558c42a56d034dcaf6fb1b28037362c7c6e2446bcda71d0a88adda3144589447ef13cb85a4d2cd16ef444097bc03e32c3b1a055e952f7ac87078b04deb900375a16dbd382ea4375ddc0a9645deca620590337e803ea8b41337f3f4e4030119a2337424dbea3d21214063ce853843dd4e6df94e3dc3bbb36d89d9eb8e15e52d0699bc6ad1de9d12afc95c8785d63756576d357126e13b25502d542774f6e5d2fdb559d52698d08600fd05aa5d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee0000000000000003000000000007a120bf5899359b258acdec0ea500e437267aa6ba18e8509e15df74518f6ba7aa348f00061b1000036d768d1d63f1c9f09c252b5b48cf4d2db3f4935150c551391b37727723168982d7e58ce2a769313e461a0f3791a8c0208a769f5bdf4d57fbd0a9de104a0b1bbc1ab25ebbf87d1bc86dbbd42fd0dc0ff18a7ebfdd692c7dc3b95d095052540ce7801f3e25cbbcfd9dab857bc39624f59facbfacef5ab1e1e1f889b85f3b1f2a580cd660b73aa662fb15487722bd3c3f93d272725289136f2ee0fae4efe1afea25e6d4fc8334a47ad62d22be06605a15538dbd2a81311c4489b91d1cb143743e4570a6345c4f035c060aaf287ef66e7ebbe7b9037c10b66e087827478fdf76a02d25fe90e0f8228c1edfcb12eee3dd4e505a6c5a7bf2f5954ebb5560cd8c7f8b8f3f4ddca41a48a0d6c0e1092dcadc853752f459486bed349213cc15044585255842717ab70a3de3f0eedeecca10112c85a8bc248dc66c883a62288b49588d9fcc048c51081e94d65bd4731e7d71fba13693b82d2831d3bea370918aa5ddf1cc4f0d5015bb8dfb951ab13fbb9d26d5cb83dc980fc36f1712d616ce24d2c530253320f4f322f093a605ea426c577544f2983efc80be56791f443652c2233039a68f966c2f0b6351068616755dd2036b6226244d394a2b5b59160217603149901e8abe19a2bf404f384c2ed7fb0c5e470ee5ee8561f58f66bda729c2c8816853ad2357a009e537efcb4a28e845ca616be917b15aa6b8eb280bfcb321ea62fff21168b8ed54d58ccfdeee0e7752bfc0f02549d76615c85dd1e152a85ee931b34f436439e2233740328ba504c49f9764e1dca645ebf6a1377310ab53b68b4d0a6e6c952068249b86c29061725035db8d294ab9c56901485814735aa2a8d6987b1a19ced65a332f97751c4cd8a27093851f7775e5314078c04d254754d976bed2dbd2e6ecda62e9a0c7fd95299b4b13a54c9498d384210fb42d3b6bc5d8f0d42e42879f86c21eb7c5c6d1bffdd598b8f3cfcb75df159f1125a65f960637c62c7c5632d73b7b4b0544082008ede22d87e79e20eb08be0817650fefcd111de48ba2be02a7b080275c991a0ee4445dab89312644c7cf4101895e2dbcaad7d87e8e3b13e62751861b204a7e6f5a476eab0817c294d59aa0247903077d4cbe4a98e7984d2b04623d2b2ef4c650b43db15541ede229c12c045529b5c77993eb6acbdc28d812a486b5957fb996731980555bdd59ad824a882ebe1a77cbe6b9035f1c69dd01b2a27a47be5febfa65c721354e70071b07db4ebc2f01d143587c1b32a5337dd010d2a76a7773f4a7c665b4cfe4a61b103b1c319d85e007eb99b52400cd8776697e1d6118197655bf7bd0a5e7f4594bf36a2706128d5f5c3ee166b586c4d515611f4597a4c1088c1853a5959f73830cb973ea922d6211ee7d9b1d67b1025486f8f3c72a517d0d48d9a57d64c0f48e513c3b09e14ce91b515a87f3035ab55d241ccb12108dd299a362af26af96ada920202dfe26d456065717a85e6bbec540637059d82480f6c917a11434a9be5fee5ba33a8552b7b0e59f123991525e1dc14bfdfd109625b2df477bce565045375dacf6ffe99081914fc9f64df7ef8eb26801ce01be083555fd2f8a338a33c07f484b01a310ee420f5c932cfc5a8f6d32a20c3915a188833ac5775500c5d2b73e4ea595512e869f91f83de8e048c804ec8cd6de45b7ad264bcfb3c235325d3c09673a2a94e60736ceada065cefb1e355bd35bd4b56ae513343e85a3d840c2211da2d1941112318f97f825e1714f74fc2d33430196cca2423f43641b0d75b4b1a1a1ef0f07af31fda06220a2628aaab9f303cb4fe6d73fa9b39e8f6083af3bbca1becdd646afbd888c560bbf7cf4fcf5c02f712726eb23b03fe5c290df63a85ed1026cee07ab0d2bb868aa4dd6594252cb75ad5d11d9c53c5238047ea3d311c1443d478dd283a260270400002710000000002c2322200000000008af34a0245d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee000000002b40420f0000000000220020c57347ca54a9e6f279f6a1f1e50f19b48289c3baccdd356fb03033ae7ccb6e444752210252a01d9d8b03db1a99b1a82223f7dd60ecffa69dbef47c06228fdea2fe0f0215210322a747c1d7f77fc7577a689618bbeadf28b941412404ac5e216d684a32d57a8e52aefd01d9020000000001015d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee0000000000e136df8005401f00000000000022002019cccc41d4120d54831ad41b091b1e52b8902711365f1cbd9a44a7b5a3dc22b450c3000000000000220020653fa8ccacaea967b6bbfe9411c3f812cb44c4a18d4f6806fd81512009f706e750c3000000000000220020c9c8b5e68eea1a6f32394124873d68c66b1cab8ffe657c852696e1a1597783d924390200000000001600141fa232bbb376f103dd015631dc8d6f4f9d306122241c0b00000000002200207121fb3dfd089e1a7b7cf0934e4cc42e99678c7db90927a358985a6471d0cffc040046304302204b7524262f7aa8fbf4e9fadf476ba42b4202617b16e4d1e1ac7c9db1adb8a126021f59622119b96d12a66c6f18f12b5c04764c576f9ccb4216049ddd6e719cef9201473044022003f76c8bbfc91e5323ddc1d7a95e8a3c7707de898e6a50fd5e6562b8412e32fb022010b2bb7edcf519a9451b3883832a39a0f9008903b52fb2db90e6e371bf20307b014752210252a01d9d8b03db1a99b1a82223f7dd60ecffa69dbef47c06228fdea2fe0f0215210322a747c1d7f77fc7577a689618bbeadf28b941412404ac5e216d684a32d57a8e52aec34a86200003000324489133c313ebc91202d43a19b2034b1b2df6ccc257712bb0c38cd1d3141e42ac000000002b401f00000000000022002019cccc41d4120d54831ad41b091b1e52b8902711365f1cbd9a44a7b5a3dc22b48576a91423ca5b93a48d00f645081be0479fa799c70731a28763ac672102897afb6799af1c1af49fe4c96800ee1cea77553c0b5ae9b8cca5347238cf5be77c820120876475527c21035a26304d46e27993c218a0c644a613ca87630c8f0e1db5f112a01c3af26cdb8f52ae67a914d3260c3a0710948e34d708a99ff708f9c257ac5288ac68685e0200000001489133c313ebc91202d43a19b2034b1b2df6ccc257712bb0c38cd1d3141e42ac000000000000000000015a050000000000002200207121fb3dfd089e1a7b7cf0934e4cc42e99678c7db90927a358985a6471d0cffc101b060040ac4bb46e1b736a6fc76a4d86b24df1e9f9f91013025209ba64daf333863a2bde59a51a7af931bf0b07d6154daa30ed3a9c8c33d173c75765b46674a4e249bb734061aa4d418884ef272ea2bd65d745c42b5bd5f6781b7f876402b10eb505c60d086ddf3e108528e65f4712503114c24a20c8fab7867761677401defa780c4574f5000324489133c313ebc91202d43a19b2034b1b2df6ccc257712bb0c38cd1d3141e42ac010000002b50c3000000000000220020653fa8ccacaea967b6bbfe9411c3f812cb44c4a18d4f6806fd81512009f706e78576a91423ca5b93a48d00f645081be0479fa799c70731a28763ac672102897afb6799af1c1af49fe4c96800ee1cea77553c0b5ae9b8cca5347238cf5be77c820120876475527c21035a26304d46e27993c218a0c644a613ca87630c8f0e1db5f112a01c3af26cdb8f52ae67a914caf9c0d315f1ca821720d6911e090095585cee2788ac68685e0200000001489133c313ebc91202d43a19b2034b1b2df6ccc257712bb0c38cd1d3141e42ac010000000000000000016aa90000000000002200207121fb3dfd089e1a7b7cf0934e4cc42e99678c7db90927a358985a6471d0cffc101b060040dc5ef2218b256e0db9981ab591cf830819b62ae2068b6c4d19a85ba03153ff39316c14c1570a8fdbc2765b38a16c74e76ec7190f47aa3754e08c770d8c7e918640678fd252d77d34b3ecefff1fa369e92dad0b4a2632efe13974e538e13e14780c4c6c21838a7ead4878c9836405e45333651de6cbc012af4d6c1bda4a0039d5aa000224489133c313ebc91202d43a19b2034b1b2df6ccc257712bb0c38cd1d3141e42ac020000002b50c3000000000000220020c9c8b5e68eea1a6f32394124873d68c66b1cab8ffe657c852696e1a1597783d98b76a91423ca5b93a48d00f645081be0479fa799c70731a28763ac672102897afb6799af1c1af49fe4c96800ee1cea77553c0b5ae9b8cca5347238cf5be77c8201208763a9149bd34d5a8ea2d91b8ac4d1fb4ce79bcfd481c1f088527c21035a26304d46e27993c218a0c644a613ca87630c8f0e1db5f112a01c3af26cdb8f52ae677503101b06b175ac68685e0200000001489133c313ebc91202d43a19b2034b1b2df6ccc257712bb0c38cd1d3141e42ac02000000000000000001daa70000000000002200207121fb3dfd089e1a7b7cf0934e4cc42e99678c7db90927a358985a6471d0cffc00000000ab009f4d0b317a141e5b3f865599676f895834400b66dd09d33ad27163ca176f401e7b146982a595ed1a95e1225312dce24f45237477efca22c759c9cb16c4a6bc1c9e8834a18eb0c6c389a14ea03fb7062f788003c5c58e738d78e28e004014a64013f1f51471ecdb32897a5f604a254334f7f5fa26de5fc63b96c942db2196ae9e43b34f00054e0c58a061d5ae5f4938b5d449b8f9371edd76efdfcce758a102c500000000000000010004fffd05aa5d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee00000000000000000000000002faf08011b29e60a38883a8d4434f17ca3d92161109f7ddd8799e64e86d6b8509babd1100061b100003b8c1771721551fa88af8fdde92909add6e5b8fa90a4b0484ee065ed3ed7c56e733a7fcd775d4ab92956c1328ffee9c195004c5dee5dd5b9d0f9034589e6769e72579d3d5837ad70785ec420b4a24c04d36668728c0d2534ff1feea9aac2410423fd79c7db9231ee7efd3d585646e378fe53d731d18f38d6356a970f5c3026edc849d49ff34e58dfb7548512461110088ac3aa800e10785029ba3b0e9ab7bde0f056939e4921792dba2f5c005135daf57e32cae06a9ccb1b4d321f3ba015e5b92def1ff1c200e56b3990d82570586bfae26e9398e17dc6c069f92d80e6dfedf6b2f24b1dc3cc9d63e684d861f40fdbf508d4ac34b7f10c57be2a9b0c5921f86869c29ada5394b8780d2488a4fca3cd98ddb0ff8ea4415a07caea436682835744e94d5cff6d3024a9525dbd697e499b7ef23062b18b225bfaa4c5bb07166f34ff7866ec8f0fbbc12f695c609692798364fa20bf7977e321deda3fe5510833494532fba94fc1f0dd14ec74f3e9fe8ee659634621b63d16d46a8958132c24bd82c516bdf9ae9515cebae42778e4de6be7047c31cf86c0df0306f7b6562e1f35be51e5e64cc6d9d4c010849e6ac7ddacaa4b7b6fb1d35aac815964090940e73a1193eece11c1c1d37e373ef58c5e2d690b6ed6338360af9906146da9db8329bd2786bbf92df10445ee093f0b1b2a640cc2daf003fa7141435ba1dd54f9cdbf5417fa7f539b255452852a85d2ce97ce5abed4980e7b409e283f97ccc9c01e104b55155f96ace6789f61c4661962d34fc5d7e6f5f5233180933b2fa7f7a5b074714645489f5221966160946b7bfbf0fe6733e6beb8af4457b9d36cde1200811009ec483a9d730ca980aa28f636942af5e89794a8edbc1b75d555ba134974374d0fe23d31c26566064eb9998d649bb2bf066bf710da50672f4e3ab4df843a0c8942bad0a071c237d4c1759eca37380919e36aec73284db202a32d3d1619f3e5b757b2df8b04bde567783dc8e465d996799782f1a1b8de9331681a35aa04edb427de87264c8ae9c397f29d3e8730db91256425a10b960a9de1a48d0d4186d617d2b69c87e2540f6570faff4ee1f6303d7d281434947abeaad83c86a4d25bef4de2bb3c6104aa0ceed7c8df039f4be6a42851a118adb1b8f98e02f6727b75d98541bab2ff24fb2f20342e86150c678941825409b62a844f44ca1ccdf0d9f7c2cf9b222fbed00bc92be0802fbfbbeefa71c8976cba8fc4aeb031480f434027b1cd593d08cbc14c2a360b736b06b5afb8da35f0be3818fff4275b8c830f5248a8b8edea1327454e1360bd90d4fa08e965f459b0b027e1180290cf762f813a31e8109f472d9657b03af737d1f7bd2e59441541a84ba818f1413c5cd1f8b9882e9188e0def9e44e2f4a7c710c893c7188ba86423f8ae86068d84e1832af548289e87c34d68b186df7e24ca5b051f8f5e4a44e2e7383ba2a09615b4147b34e86486731290ea67f3be24c13a9c5cc37f06555989b3f10c580a9cd2b416d0ee4210855c6833a25996761dfabb036f3893cff7db7e310baa8faa79f46e0ee43bf4dfd732eae7f44bad2e7c032b9c6d14947af6b0e37e5ec98372a622f716ffba0cde04b9d4508392dd154ddc34829412bfa604d4f00e4b10a553587343ef5c0944165e7ee1e34387b09c147ecba943cf36dbc4269efe50ec3a5a3075c43be9651d6db6acb9f657476952b78c990557f05935247a71077373ec436ec586def177448f8859ba096b7a838e5b4ce7a463f9082f705c26d99936eb1be584ea9b58a44b9b4faa07fd8247fa66cf4529d1b8cdb92ed7bd96bf0968db4376489c7d46f0f27d58ac884c29736502953723ef1ab41e19c7041d3e0e9091d7de2e3904d032de02292edb1225a672ab438d3c65f7921c06a9f181f8ffda4ac524d0e0fffd05aa5d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee000000000000000100000000007a1200ffb841fb291ecf09ae7b5dcec1feeb45ba196ca02d6b9e50ae2b3dcd9ca5d72500061b100003acd0a3acb9b4f9540678dc9324480bb3d4f54e5e007739c9c1d600bff75dfbbd0191e75c0a2d810a6ec5b03d02cffbf1a66123c87790e66eee8d416caf82e7ea7090a62fe14276fa88af32ab9793f7a100de5525eedf71967c13c8d361246d98b78cc74383e714f88899f34407644c14874046b3b722186015c07b8db042db955c91cb14abbf3cfa646aea81ad15bf67108a763539c64c5a8e8115d46e063e956671e8ea8d8fd638a6414d71e9b475ebe070da7faf75a898f29048ab5a2b6c7e3a72a178b8e470e8375f539ebf6284d15486c5a8774d46ea164ba2b62181f47623fd987ff5958550c962a193638679b79fcd477fdf2a09c0fa879bb22cb493fbaed27518f5cb265741535b4ab14246077ca18f11ece7aaa0e01ec5bf02c3c3b541ea08bf254df123079c1538e266dcd3161bf1b9ed41d873f1491906e1459ba51ac9dd95e783598d3c356e0cc5b98c2a96b148f55f102a9810181eedd46cd00b445d861baeeac46eba469435aa4ddc877bd68b53f4d005aa2566d356cc344aafcdc86abd774ea28cc838d2fdc541c4b6da494a96e128b8c2abab4b21b3ae2646cdcc3528ef6fd8587b3a0636ead67a62309fb003afdc14177d329b062622313e9dee912847763c68678df663a39b89c69efdb6d916d5754534bdca9030955cbcbae6fb7ff1df6282175cd37a30a904418b976af05809f0e0e7e4b4e2ec018f1e9c6bcbe7a7822c8699669946f5e684671d63e68cc7c9cca2963945dc21c52232e6f83b1875b2bed7c80c37371a480a2e5255d49d390c3b2adfc695036ed91371cda7d79bdfbae464581f0b32942f03826aca17ab9da6ade4a778d310ec3da17fc3af426d21b347aee7c2db7b5e188e35714dc514e3a1c100e8595c9e0e4399ad796021976f077e5733ea535cc6daec2e371853dcb715fc366ea7d6b9a5b3509dccf5c2e1225e3a51de9f5bb9b6586b282a0b27a9ae7ae8f2be14ec677670241e384b462eecfde68957839b1327c9e5c622c0f67cdaf3845ddbe6f754401d720d6b6d5c061dc906bfa70fb76e1168c6ac1a25cabe8873c3c1e540ae44ae631a2638accd7951f368442dba7b38d0662ccb0140d1e4ca23f51de731a6f5adcf816c3235359afd607e58948da29a5f06c96b4312aee7d35ed4c2c811a58c5a196ac2f377d653d51cfccb5213c928955ac880b5fb1b91e88a52d5c217cbf78e071275fe626c230fded548b0f1667af1309149ff74c5542119d4e269fdc1b241d9f53e02e38e015b7c5c2d2ee623bcb4167e37edafddc7fadd642c20f81b454db1a3b578d527f124dbd1f3d99fdd1590256ae4e47c2e8b3bfe8708a0d5506d6ce8b130ce6b70028161454a5065e9925d75c0095dc24ba789489fa1e9236e25330ca1a45e61224ee027664f6589028a240961aff09187fb719ff3477b56427189b7b3c790b4031f6539c5e3a8a5d7fd99c2534ed1646920a43e7315bba98d59c51b337ba7a1b038006bb574df46830f96a5685e07ee8a0a41e712810faacfb231c67e69d0fc24b98d782c70e15524d5d2dcf4e64b4e26772dfa7067f6dc7ffc8b06e6ef3ecb13f927d466e0cd3a7ea09aaed90b7810bbfdcd8a1274bbe78a453ffff11ccee62059ec25955b34a1a1cdf8a3e506d99dcbadf16032646117556ad71cd93ceeec42be0350a6c9f194fea783558c42a56d034dcaf6fb1b28037362c7c6e2446bcda71d0a88adda3144589447ef13cb85a4d2cd16ef444097bc03e32c3b1a055e952f7ac87078b04deb900375a16dbd382ea4375ddc0a9645deca620590337e803ea8b41337f3f4e4030119a2337424dbea3d21214063ce853843dd4e6df94e3dc3bbb36d89d9eb8e15e52d0699bc6ad1de9d12afc95c8785d63756576d357126e13b25502d542774f6e5d2fdb559d52698d086fffd05aa5d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee000000000000000200000000000f4240657c0bd97e795218aa623b27cf9a71764379c4762fcee8993aa0b1ab1e32194a00061b100002c0ec5d388a8c78491bbd870faa2c46e4282e11796123b69c2792e5806748ef068397f0212a33e3f79162ba4ea247ccec410db039dd323af48ac27bd0ba77ecb870c587477d4543d9a29c53fc02bc98d7cd0144c7abf80b999c22b42a28ae8d625478ca304001f9a49782ec970031e673c76e4e27357a321729d6df38d1d88dcbf764c69eda3baac9739bed637010f44638cfe1deecc56b76f6e02d1d0c3f104462b9ffa5f20de4cf092d86a5bb35d5f62b0fb1c983a2c06df17c9ffc809c83e4b4335f5903fab536fbd9719847bb063541ecbe05c12ef8d058b3547faca054e3d662250f1cc1f925dd71297abc25fe37ab33a086759fac76208a64552f84d2e4d84daccdc3aa2bbd2c2f922bf262596742dfe034529d1ead2975dd3d197ab0e2e1c75c8b8f160ca6077638022d4afbd107979949cf342cb399347f3990029f0db6d9ac0c569d61d42539371f9a7ff59e9c83ff97d15bf0eeb254ae58fb7b1f9d8710c546ac8a227930c66ac841bc4f475229e5cadd14ba5a01e6b2da99c55861a08e2100e62c4499d30003fe30ddaa347d7a27c2158d3787d58fe51ae57d797bbef7f900508d1580df3e5233f0887567fba1faa918c246d2ec5c3b7aa022cb8a652d00b4d719e312482f57655eee80a90cdc73151fd7ab9c5367793d60c6088fab98f0547d7f547e10db202a25e027a5cd0abc41bb0e3ef563c0a6d469a702b2a26f0e8b4fddb845a16a5f06b9dee33c3adb31430c94942c5023179d3e4441948a332069a1c3b69dca65f05a43452e42fd28a2f7e6344f98ab9a7e4eece3c1709be1f7bb620f8b6c45989a8bccad39a4bf40e8215183d1449196f1f9fc17de778b616856152e6e6145a1b7a3d7f226becaea5ebe34aa4bd06e60f0fed207bfd21f5663bfadd37dd722437bcd46a26fb4e19d062574a81bcd817eecbc1914a5878809128961acdd73113ae9c51070ff4494e16d81ccec777eeb513da82bf43d4884812b26546b4370dc315793271b069f60f4285f648cf122ed8b22b0c7a27e94ccd59a273eb774c109e19980e146850de95f82cdd8aa0e82022672024c917b281422d284df0ee0bdeb3d4ac56b4ca675ebdb835c17b6a822d79ae7310f4aa41d80ac61c5e45c1c0e1d64542622a31091a9f87c335e86d964dd85a951d7c9bf41c9f2b1a9bb8424d7d1b26413da8034182fa42d2b1cd1f8745482c49d8348d19c72cf5a02bd28e4cba82128af8bf5d9c1215c4f543ef4d185f100f8d803dfa29c300c072e44ad9542b82fb1380d55c15c9a4b4398876e2450b90b49990746f339abca8cc8a462b62329a128758ce0e46b5f998af1bb485a3044bd125424eb5c623afd2a11befe4ec544eafe275ed1ad82b940dad5e9a9710d48562e51b296ba81f2d70593685ba0e3f3b25089a187e61d5675dd481aa99620276cb0a841a3c4df201a929287b1127270c5d25d06fb286dae1a9a5a5cdb60003f0c30d2021074bf252e550685f7b51a087a77b0871e883104e55f898aa5bc4cf8538c293253a737556d7f220e15b90cf0eda7d5f2172372e3c50c12cc588f312da37191b5038e944825044b130bff281ecd47a4252a1411ab7a9305c2b37e9facd435e9c434de37641498f8e4bfa7b42966da29c84200aca87ea1c3b00db54906b340e524a7dc4a15403bb82bc24517cb91026096bdf18f5f7ae5640ed6de1f0c5d184813d6b9d244b32b58e9ff524741a39383eec3a530d60db13deb26e3523a725f0599b671b625c07002704fb600b77318417d2527537359d122e22a1f7581eaebdc19e65ba50bdda18ae08e9a8694fcb0ff1a2cd98d910dbcd52064c15a4282d67b278c72a0fdbf228abf6b519dd28ac21c57d1da4bb7ad5b5ab10da6b83132df1da79ccfc77fb45598bbd91ef5ab96d8a2ee148639a562debafffd05aa5d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee0000000000000003000000000007a120bf5899359b258acdec0ea500e437267aa6ba18e8509e15df74518f6ba7aa348f00061b1000036d768d1d63f1c9f09c252b5b48cf4d2db3f4935150c551391b37727723168982d7e58ce2a769313e461a0f3791a8c0208a769f5bdf4d57fbd0a9de104a0b1bbc1ab25ebbf87d1bc86dbbd42fd0dc0ff18a7ebfdd692c7dc3b95d095052540ce7801f3e25cbbcfd9dab857bc39624f59facbfacef5ab1e1e1f889b85f3b1f2a580cd660b73aa662fb15487722bd3c3f93d272725289136f2ee0fae4efe1afea25e6d4fc8334a47ad62d22be06605a15538dbd2a81311c4489b91d1cb143743e4570a6345c4f035c060aaf287ef66e7ebbe7b9037c10b66e087827478fdf76a02d25fe90e0f8228c1edfcb12eee3dd4e505a6c5a7bf2f5954ebb5560cd8c7f8b8f3f4ddca41a48a0d6c0e1092dcadc853752f459486bed349213cc15044585255842717ab70a3de3f0eedeecca10112c85a8bc248dc66c883a62288b49588d9fcc048c51081e94d65bd4731e7d71fba13693b82d2831d3bea370918aa5ddf1cc4f0d5015bb8dfb951ab13fbb9d26d5cb83dc980fc36f1712d616ce24d2c530253320f4f322f093a605ea426c577544f2983efc80be56791f443652c2233039a68f966c2f0b6351068616755dd2036b6226244d394a2b5b59160217603149901e8abe19a2bf404f384c2ed7fb0c5e470ee5ee8561f58f66bda729c2c8816853ad2357a009e537efcb4a28e845ca616be917b15aa6b8eb280bfcb321ea62fff21168b8ed54d58ccfdeee0e7752bfc0f02549d76615c85dd1e152a85ee931b34f436439e2233740328ba504c49f9764e1dca645ebf6a1377310ab53b68b4d0a6e6c952068249b86c29061725035db8d294ab9c56901485814735aa2a8d6987b1a19ced65a332f97751c4cd8a27093851f7775e5314078c04d254754d976bed2dbd2e6ecda62e9a0c7fd95299b4b13a54c9498d384210fb42d3b6bc5d8f0d42e42879f86c21eb7c5c6d1bffdd598b8f3cfcb75df159f1125a65f960637c62c7c5632d73b7b4b0544082008ede22d87e79e20eb08be0817650fefcd111de48ba2be02a7b080275c991a0ee4445dab89312644c7cf4101895e2dbcaad7d87e8e3b13e62751861b204a7e6f5a476eab0817c294d59aa0247903077d4cbe4a98e7984d2b04623d2b2ef4c650b43db15541ede229c12c045529b5c77993eb6acbdc28d812a486b5957fb996731980555bdd59ad824a882ebe1a77cbe6b9035f1c69dd01b2a27a47be5febfa65c721354e70071b07db4ebc2f01d143587c1b32a5337dd010d2a76a7773f4a7c665b4cfe4a61b103b1c319d85e007eb99b52400cd8776697e1d6118197655bf7bd0a5e7f4594bf36a2706128d5f5c3ee166b586c4d515611f4597a4c1088c1853a5959f73830cb973ea922d6211ee7d9b1d67b1025486f8f3c72a517d0d48d9a57d64c0f48e513c3b09e14ce91b515a87f3035ab55d241ccb12108dd299a362af26af96ada920202dfe26d456065717a85e6bbec540637059d82480f6c917a11434a9be5fee5ba33a8552b7b0e59f123991525e1dc14bfdfd109625b2df477bce565045375dacf6ffe99081914fc9f64df7ef8eb26801ce01be083555fd2f8a338a33c07f484b01a310ee420f5c932cfc5a8f6d32a20c3915a188833ac5775500c5d2b73e4ea595512e869f91f83de8e048c804ec8cd6de45b7ad264bcfb3c235325d3c09673a2a94e60736ceada065cefb1e355bd35bd4b56ae513343e85a3d840c2211da2d1941112318f97f825e1714f74fc2d33430196cca2423f43641b0d75b4b1a1a1ef0f07af31fda06220a2628aaab9f303cb4fe6d73fa9b39e8f6083af3bbca1becdd646afbd888c560bbf7cf4fcf5c02f712726eb23b03fe5c290df63a85ed1026cee07ab0d2bb868aa4dd6594252cb75ad5d11d9c53c5238047ea3d311c1443d478dd283a260270400002710000000000bebc200000000002c232220b8e78d93ef82c5351ede6c6aceaaafb806ef6ff23deb81fd78e7a9bebfcdeb5302f6bed70479b4d98f5c93f32b382524233983ebebd14b2b50fe35142766300efe000000000000000000000003fd05ac00805d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee000000000000000000000000000493e0f81fd474bea478df0202b311c69e85dc6215f629491dd15ad0929faae2535abb00061b10000370b2714d2734e6b8cde085794dd7b41c8a9b6c03c1edd8e3db168ee7fce39493596e882b18b5b1b79c16400c6762b9856075821be6be9fab8f469f56820d8f341554400a8da7f1f1a8501902581d43b9fa6e5c68015716f718a2190b87fce41bf1b509aa61806394a42489d63c457fe4c79e7480eced1315edd731887e57704fc9102f50cb7f0d242d755cfd5a2172dbaf7f01b124861cc6d1dc804796bbb84165c805f0c0f3fb9ec97b74c2a694de56a9cf8d79d1a679260ee1169d78214b34c8a654ba22e59ddcd32beff4713de33549f035b342660405b0159a7a508e5691ef4805689140e72b8a0ef2e61be74dea5d0b8f5589e0e373cac2e2e1cc39b2121c05cf4122ad0f8b9af6fbf1de2ea26376c2650ccd306c13a7b64acbf2a3feed128754abe44658009e642768ae3d84f5e0fa5f7f360c2a1c76d26985817ae77b71fb59014a5483ebba9271cafa5e5d8031c569adeceb8bae6444e98d2522b28f6682109fc7d31cdb83ebd45e5d81e7f046df42345b49f470dbef9ed87709301d2c6131215d33a30b8d18e63e54a2aff85dd57672f8198bca6a67ee147c7d0ae649e5661ab6bf78a662fef9a164f1e332b9f16e6fb3d5769ddcbc1d1c07338d3394b9245d17618c2474e86c064fca4df00ad3a93dc051fd8c3328cde2a987798b0f22a21c90426700abeb1e6f38dffb485b5477ec44c690fa80e317b32a982fd3082253bba8595783290dbffee4fc9296ffdf16a8bf3154971bb720e78674969e9db2e0fbab9e9e13f24bc8b3af5e2f00f262f0da56de443f70398ab68f747d35370fcd8e1c0e130f7269e08f862b5a67f2c129be254df2358762ce3a947eb27d66450af51540e7721b47c8a5a86098ea64dad381f14e07aabbbc470949a99c07612add3ab4c575fe2e520bbe511a1a674aea37a44535c13ee3380f8f39bd230fc1481cd31912af36c6751e23c6f383cd37a8b13fa7df9f0c7e460739f2c6226638ee14f14d36366211cbc6a1e16b4856bf302a540aa9d9e833b1d59c510473096384c8b450f2f3f1dab9e614af822949d5cc93d76bc4d1a52891bc85f1981ef83161195ab7d8181ee4fb163bc6c685a10e87c7f4b15ed7d05833c230a4a5b63841fc65b959f0ff010e697f47c583f9b7fa9b389c0eff6614e47d85b83c483136f182be4c151d272f5d938b912a95e47d333e5de6a409ad271679a778a7eb3f169c71525302fac5d4575e2645c09763c2ef165736a7a726ca605038e2781404328790ffaacef2b9c2bf90122042cd571287bc4e3973da65fbd4e3da9e40e4347ca6eb4ef1ffef4e5a34be80425cae3e81533f7f2953f95fca53a22057a39125f5c76350fba7fc6c036838fb951d0aa8702e7f44c6f8a9cbce3b64fa8ddc2bb8c8b35d1e29a21beda6fdd332b31a749321455277231fd9d70ea4aded95053b395f88fa6916d126e1626fc0f1be6cd2a9538d17c498b40927f12b3bb40fa3e272e82cd2242b670afefa387470f4e6e0a1236028954c9e90311f486617187956a23b90b356d71e219e6dd055c2120771003a6c12769aa3ceacb9642bc01022731ca7a413b68ee7d1d5444f75dfa51a68b74a01ac85f6ceaf5e56987b9d67d6de896f5aafd25c78c413a6d4b5b03d571167524cd231ba13bd9f80fd7413faf21e8170cef0d08b242c5c38a2b0158da56e358ba0692f670d4611c7a3624b234adc30c5b7198e0afc941f5d13eae3a94ddffa652c784c34c582e04e948da91a5ac3038a9df38fd4f1733779f4f122ca2d7ff9d03bac9def35d9ee3a183161f8f2808d472b2e64581209359cea58ca7757164c666029982223877e2b14d2d537afb012f1ffc12cd083c16dfc64213c56f3d4d22b603d3dfab1d21e239d6fc1f9f153ed61f1ac91c29c85c16f4aa2985f84052f5a08d32bddfd05ac00805d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee00000000000000010000000002faf080ab009f4d0b317a141e5b3f865599676f895834400b66dd09d33ad27163ca176f00061b1000028fe56ab181f454372c939ca0516f5782b26cec2010885c70e55c41a1e43de3af6635d2ed0bed90837cefa9f1805f4808e8092a4d44efe5fb616ff7678487a460b367134fcc728ba273fb1d22718bc6a95e47a120a6d952c7c2cb8f38e59c2a4efa63977cced7e4b8f46e4d47d29098a73beee807c3337c4acddcbb32b78eddbd124b2f33ec6cd8bdd364aa4ad2c10eb69dab808fe5f5f0aec19750e51ac65a8746f345c05d4b8823ffbeadd6200ad01449c39a008fbe117a8ee904445488811336d0c439419fa4f285f9f62a34f10b076c99c0092968e3cc9fa656016b6da049bd56b910d7a9356e76d24e746b280f0275ec9e9bace82d852bf0a137ea02d4cbd3b68450bfb593564d8c20953bb758890a55a8c381a4b3303b61ec26a56111361bf7262b3f6f2503aad06758130d86ea607cdbba53415aaf253430d92fdd81c685ab39233e94654e6508eec1347747e2df2862169382aef6f99dd78b50629c5d98b1fcc73e865679d862b42f8e9d54ef6288ed2c3f2713f0fa4db538cd3e70ec1a30cd65dbf873f581b30892acedacd39b5f0aa774d1f3f77d8fd11ed628bcd02ac33f89123595aa455ec54a07e93e26f94338fedd8bb84094a0add52f912ed5f9019e3a28d90d251cc6ed7ffd35254dcadd9f1e9b28eb0e06fd4fe961d60cb690a7757f475c08aef07c2e54668121540a42a9c779623709a2124629e8c4bd4021763979647f625b360a4559dfd3f57798dfe5d36e9d902904af3ed67d8f4b0894538c7718f5160d211cec27375a7e6a2ec42f2c8fcd1c953b7b8379d42439a2c6b921a66d5102ceb6bd6bc20b17098e69a0a4f708b42520e4792474c3d115a12c83ef60ac6e69d8842c5981e9a6d178efa352e73e4a34bed4fb590dbeecb259617668e6ffb9f955297f26e3a6a3b95d9617529a61f08666ca1069d2ee1876337d3e786244c5bb45a8236577184584cf3018118d7e4e78973ee510b6773bd922797e580cd240dea3ca31892d23c1e6e4fa92f1a01da8ea40044f5613a9429ebe7906f79b32636204d025115810b376d4c6436da136b96c7c10649e3290caecd6ca14d995a817e3725fee7e621c5366f80c752e50aeffee1af3361924f31cbb1cb44731d19963ff30127ca2363ce15e50948be14c43400737ee8910ed06027599da74b06e77eb82ac523cc031c57c02dd82dbc0d53629d072615c92034cf829e7a5d4437b1f58e2bd4b16993e1e1b05c26ed8d695351db11d21df36a7f5811ef5fe001ab1e1c6ce9d2b69b6ac3af8087e6666317f75b645e3b1caefac0eb65327fcb9fa62be341c99f191cc869e48dbc8fee3e42d4393cbc6505c880dd6739a69be4f7ef3de306480a7a51f413d310926f252ea96a0c772d8b8e94e7d6cedbfbdb21fae2ffc379eb17c2680fa2bc56a8726c93e7bf2d446221ce95e49da93d29bec8e53ddcfd262c33d556c2b8921c3de93236408b462d28612d3343fbb9cc538b1e6b33c341c3b91dd41f936931e61f146fd00aee1c5c0de97b47cf7efce889012e1c22dd8faf0fe155f4e9930c27941d8b0907502a835bfffff801f6835de69ad33e95232f773219eec0e2374c421230f323257dbc91629c4ca8a61584f737b827fe8e8f5b69b88a7b64b362f8142b043f08ea82c4a0ab7c4e0b9805533e806f90597095242ff64f314801fb7ad838e98e1859b2c05c9b027ae5a4baf780d15977bc1492dee9b14b1cb0fb3243eb2304919486fcde89a3cf35a64e31b1698e35fbb8528a73526a19189d406272b8becec94379f69372afa99d06bb4f34df72e1c3b49557855ae8ac265160bdf48ab34cde30d2665891cfeda24adcc657d851431f38953f917f1a111f023d2c71845ccf25a562d2450bf8b4986b64ae4fd09e5a8ab9610d11fd68e9d570b3a467780236de974c7fd05ac00805d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee000000000000000200000000003d0900559bb949364ed92a64f449cd6ee3eaba2e607595d3cecb36b06b145baaa69bc000061b100002860fd058656f185036e81a64fe19034d29223d3620bdf4bf2ff3c1def9c6bdd70c2cda7f660e1b202672741bc3258b04fb755fbbb1350261e7992bce930e256bd5d8d4fde61365b7b24904b788ef2040fdd6eb87f97c2d2f29eab4291d9a28b5da306f28b98d01d93517b203a028199d423a3545aa17522c63247f73af7b63335b0b48e4b875c69b42f4cb1573bb3e5fd68837f90c50b0161f067a9eafd9a0790e53ed5053ce60ffff410e4b16a4b7bc5a52c57e78ef266100c9f79753f81878c08e5dbd4d80c6e46a339578d8ac8c572df77ef614800cedc460c06878c0da97908067729ed35e3afe919071724f89ab736f5791a9c9b5d422136332213434c836e2ceb9fce0e2e96a9a6d7befe8c132867d5fafea1a7809ddd6b3a89c8ef6ea83028d3e2cca00f1bc6e12ea8b67e91a98acaa2edebaf6dd3a18c655b6b1fbbff5c641f8002780758d05f1f39c9470a124a5add314abd2262142733120747cda2f1d9eb90d68ecb9c7fbab23d73a35f2a20a2a365de6cd678d53bd5bd9bd518333d04e8e678b5d08f028982dad08c80be7d8fbb0638dd814232224c687f8321baf96ed8b39a1e9ab52dfd69d8eed79ac3f5a2c480a585bff038c92b367743317b937d969cdd533ae1d797a789ff7994f86a0d6cae470b64ebddbc478573af347a110dd1feaaeb4779441ec439cfdbafaba870105efd86b9d85a4df7ddb9b09f5b6b4144cd1fad5932df37ebf19a62648659fc1969142310a5cc9b4d0c48ba6bb0f863ed53a0b75fe1ee6515a46993f95be2e34166408b54a43e55c4802b37ac902fb4c8367ce38990d07ed3104d0728d327d3b9de6452b520f9af534505885788109ec78c1176ca0864d28422e826cc83f821b7eaf028d6a7e350b3037d0fe58d1d4e18113c8f61913932e71c0f334402534d8663f15445f900fb9dc6b3a93223868167be26fcbd70c0459eee37f81fd539c319eb0b04bd478b94b5f4cd23b4d496c2bdd6e8a154fd76c4ecbdf7647fe9e7be88c6a3a8e7696e2e596dfc25ba798db6ca331d135e9ce7c0aab9721d3f70ca53354f96ecd028236259b9b0d9e0bbf73c8e841b1d4276214f7be8feb525c91d39910b0e091997a2b89e945806e93cd325cb51463b0729f1a519334038cba09653799ef533a49e812e86b81af7e5099a02ca11c2b17dfc8b9e51a57a20546f2c92826676ebcb4f64fe7cc77424388dfec7199179cb125bb4613c8bf05edc4173987d7d5ae0fcbfa08a1e5ea2d6b01406d740b49c5b1a68da585549590c3ec13479efa3136c5ade68057fe173ace55593ceca8440372b03f332969866d1bfbce3fe9dd907d27593b8b2ad25eb4b12afd0f3abe7931ba7789c84a3ed65a03df06d998a9956043a4de786c359bdd58f0b9e5cfc32bc709b626ce8e63f3997a0e9f784f6b94e342b4710553e805cc8399191254189058ec75a15556467b2456d9b38a7e4d15cf59727ad2c32f0daaef1748be04311ff484479eb31f7eff9e32b816fa40f40430e801c15e931294b39ec4d6c93e8130fb4a1b53ca6471886a33b10b46d6973d02bbe3b39345e121473ea4ba41f3cfced07c3a613393e38b8ca01c353ccab96128093bb5fd000978b11ae6f7c1fedf48c3682119d1b44629d02ea3800d2e247ef1e78e527e5d574b4dd144e1fe1b0c6551442d419baba300258657792947443747b29b6fb9417d3c57536de6aa379c02f3addbd2066554189ca817c7f57331c972c30e3ed06fc7e521b8e2bb57c023dff9816f260a153f1ffd55df2a2fae568f3dc734d62ab47a77c54772b5e4cf2758c912cb473ec372173d9eda0c58b103ab12d11dcb976a40816ecfa8b9c9384f6415017555933652e77ae20e14ea9ac25b5811fc03364c4883bb78c82e29f8a8892415ff652b782642bf6036b3e2200e0000000000000004000000000000000300040000000000000000000319c0569a7b4f4021827771a963002b8b00000000000000010003d56d81344fe44d1f8f1a95850431563c00000000000000020003d33fd4c8d4ad4ce3880bf79a4856ca2100000000000000030003efcb10168b144c8bb4f694a3b98a129f000000000000000002000700fd05aa5d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee000000000000000200000000003d0900559bb949364ed92a64f449cd6ee3eaba2e607595d3cecb36b06b145baaa69bc000061b100002860fd058656f185036e81a64fe19034d29223d3620bdf4bf2ff3c1def9c6bdd70c2cda7f660e1b202672741bc3258b04fb755fbbb1350261e7992bce930e256bd5d8d4fde61365b7b24904b788ef2040fdd6eb87f97c2d2f29eab4291d9a28b5da306f28b98d01d93517b203a028199d423a3545aa17522c63247f73af7b63335b0b48e4b875c69b42f4cb1573bb3e5fd68837f90c50b0161f067a9eafd9a0790e53ed5053ce60ffff410e4b16a4b7bc5a52c57e78ef266100c9f79753f81878c08e5dbd4d80c6e46a339578d8ac8c572df77ef614800cedc460c06878c0da97908067729ed35e3afe919071724f89ab736f5791a9c9b5d422136332213434c836e2ceb9fce0e2e96a9a6d7befe8c132867d5fafea1a7809ddd6b3a89c8ef6ea83028d3e2cca00f1bc6e12ea8b67e91a98acaa2edebaf6dd3a18c655b6b1fbbff5c641f8002780758d05f1f39c9470a124a5add314abd2262142733120747cda2f1d9eb90d68ecb9c7fbab23d73a35f2a20a2a365de6cd678d53bd5bd9bd518333d04e8e678b5d08f028982dad08c80be7d8fbb0638dd814232224c687f8321baf96ed8b39a1e9ab52dfd69d8eed79ac3f5a2c480a585bff038c92b367743317b937d969cdd533ae1d797a789ff7994f86a0d6cae470b64ebddbc478573af347a110dd1feaaeb4779441ec439cfdbafaba870105efd86b9d85a4df7ddb9b09f5b6b4144cd1fad5932df37ebf19a62648659fc1969142310a5cc9b4d0c48ba6bb0f863ed53a0b75fe1ee6515a46993f95be2e34166408b54a43e55c4802b37ac902fb4c8367ce38990d07ed3104d0728d327d3b9de6452b520f9af534505885788109ec78c1176ca0864d28422e826cc83f821b7eaf028d6a7e350b3037d0fe58d1d4e18113c8f61913932e71c0f334402534d8663f15445f900fb9dc6b3a93223868167be26fcbd70c0459eee37f81fd539c319eb0b04bd478b94b5f4cd23b4d496c2bdd6e8a154fd76c4ecbdf7647fe9e7be88c6a3a8e7696e2e596dfc25ba798db6ca331d135e9ce7c0aab9721d3f70ca53354f96ecd028236259b9b0d9e0bbf73c8e841b1d4276214f7be8feb525c91d39910b0e091997a2b89e945806e93cd325cb51463b0729f1a519334038cba09653799ef533a49e812e86b81af7e5099a02ca11c2b17dfc8b9e51a57a20546f2c92826676ebcb4f64fe7cc77424388dfec7199179cb125bb4613c8bf05edc4173987d7d5ae0fcbfa08a1e5ea2d6b01406d740b49c5b1a68da585549590c3ec13479efa3136c5ade68057fe173ace55593ceca8440372b03f332969866d1bfbce3fe9dd907d27593b8b2ad25eb4b12afd0f3abe7931ba7789c84a3ed65a03df06d998a9956043a4de786c359bdd58f0b9e5cfc32bc709b626ce8e63f3997a0e9f784f6b94e342b4710553e805cc8399191254189058ec75a15556467b2456d9b38a7e4d15cf59727ad2c32f0daaef1748be04311ff484479eb31f7eff9e32b816fa40f40430e801c15e931294b39ec4d6c93e8130fb4a1b53ca6471886a33b10b46d6973d02bbe3b39345e121473ea4ba41f3cfced07c3a613393e38b8ca01c353ccab96128093bb5fd000978b11ae6f7c1fedf48c3682119d1b44629d02ea3800d2e247ef1e78e527e5d574b4dd144e1fe1b0c6551442d419baba300258657792947443747b29b6fb9417d3c57536de6aa379c02f3addbd2066554189ca817c7f57331c972c30e3ed06fc7e521b8e2bb57c023dff9816f260a153f1ffd55df2a2fae568f3dc734d62ab47a77c54772b5e4cf2758c912cb473ec372173d9eda0c58b103ab12d11dcb976a40816ecfa8b9c9384f6415017555933652e77ae20e14ea9ac25b5811fc03364c4883bb78c82e29f8a8892415ff652b782642bf6036b3e2200efffd05aa5d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee0000000000000003000000000007a120bf5899359b258acdec0ea500e437267aa6ba18e8509e15df74518f6ba7aa348f00061b1000036d768d1d63f1c9f09c252b5b48cf4d2db3f4935150c551391b37727723168982d7e58ce2a769313e461a0f3791a8c0208a769f5bdf4d57fbd0a9de104a0b1bbc1ab25ebbf87d1bc86dbbd42fd0dc0ff18a7ebfdd692c7dc3b95d095052540ce7801f3e25cbbcfd9dab857bc39624f59facbfacef5ab1e1e1f889b85f3b1f2a580cd660b73aa662fb15487722bd3c3f93d272725289136f2ee0fae4efe1afea25e6d4fc8334a47ad62d22be06605a15538dbd2a81311c4489b91d1cb143743e4570a6345c4f035c060aaf287ef66e7ebbe7b9037c10b66e087827478fdf76a02d25fe90e0f8228c1edfcb12eee3dd4e505a6c5a7bf2f5954ebb5560cd8c7f8b8f3f4ddca41a48a0d6c0e1092dcadc853752f459486bed349213cc15044585255842717ab70a3de3f0eedeecca10112c85a8bc248dc66c883a62288b49588d9fcc048c51081e94d65bd4731e7d71fba13693b82d2831d3bea370918aa5ddf1cc4f0d5015bb8dfb951ab13fbb9d26d5cb83dc980fc36f1712d616ce24d2c530253320f4f322f093a605ea426c577544f2983efc80be56791f443652c2233039a68f966c2f0b6351068616755dd2036b6226244d394a2b5b59160217603149901e8abe19a2bf404f384c2ed7fb0c5e470ee5ee8561f58f66bda729c2c8816853ad2357a009e537efcb4a28e845ca616be917b15aa6b8eb280bfcb321ea62fff21168b8ed54d58ccfdeee0e7752bfc0f02549d76615c85dd1e152a85ee931b34f436439e2233740328ba504c49f9764e1dca645ebf6a1377310ab53b68b4d0a6e6c952068249b86c29061725035db8d294ab9c56901485814735aa2a8d6987b1a19ced65a332f97751c4cd8a27093851f7775e5314078c04d254754d976bed2dbd2e6ecda62e9a0c7fd95299b4b13a54c9498d384210fb42d3b6bc5d8f0d42e42879f86c21eb7c5c6d1bffdd598b8f3cfcb75df159f1125a65f960637c62c7c5632d73b7b4b0544082008ede22d87e79e20eb08be0817650fefcd111de48ba2be02a7b080275c991a0ee4445dab89312644c7cf4101895e2dbcaad7d87e8e3b13e62751861b204a7e6f5a476eab0817c294d59aa0247903077d4cbe4a98e7984d2b04623d2b2ef4c650b43db15541ede229c12c045529b5c77993eb6acbdc28d812a486b5957fb996731980555bdd59ad824a882ebe1a77cbe6b9035f1c69dd01b2a27a47be5febfa65c721354e70071b07db4ebc2f01d143587c1b32a5337dd010d2a76a7773f4a7c665b4cfe4a61b103b1c319d85e007eb99b52400cd8776697e1d6118197655bf7bd0a5e7f4594bf36a2706128d5f5c3ee166b586c4d515611f4597a4c1088c1853a5959f73830cb973ea922d6211ee7d9b1d67b1025486f8f3c72a517d0d48d9a57d64c0f48e513c3b09e14ce91b515a87f3035ab55d241ccb12108dd299a362af26af96ada920202dfe26d456065717a85e6bbec540637059d82480f6c917a11434a9be5fee5ba33a8552b7b0e59f123991525e1dc14bfdfd109625b2df477bce565045375dacf6ffe99081914fc9f64df7ef8eb26801ce01be083555fd2f8a338a33c07f484b01a310ee420f5c932cfc5a8f6d32a20c3915a188833ac5775500c5d2b73e4ea595512e869f91f83de8e048c804ec8cd6de45b7ad264bcfb3c235325d3c09673a2a94e60736ceada065cefb1e355bd35bd4b56ae513343e85a3d840c2211da2d1941112318f97f825e1714f74fc2d33430196cca2423f43641b0d75b4b1a1a1ef0f07af31fda06220a2628aaab9f303cb4fe6d73fa9b39e8f6083af3bbca1becdd646afbd888c560bbf7cf4fcf5c02f712726eb23b03fe5c290df63a85ed1026cee07ab0d2bb868aa4dd6594252cb75ad5d11d9c53c5238047ea3d311c1443d478dd283a2602704fffd05aa5d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee000000000000000100000000007a1200ffb841fb291ecf09ae7b5dcec1feeb45ba196ca02d6b9e50ae2b3dcd9ca5d72500061b100003acd0a3acb9b4f9540678dc9324480bb3d4f54e5e007739c9c1d600bff75dfbbd0191e75c0a2d810a6ec5b03d02cffbf1a66123c87790e66eee8d416caf82e7ea7090a62fe14276fa88af32ab9793f7a100de5525eedf71967c13c8d361246d98b78cc74383e714f88899f34407644c14874046b3b722186015c07b8db042db955c91cb14abbf3cfa646aea81ad15bf67108a763539c64c5a8e8115d46e063e956671e8ea8d8fd638a6414d71e9b475ebe070da7faf75a898f29048ab5a2b6c7e3a72a178b8e470e8375f539ebf6284d15486c5a8774d46ea164ba2b62181f47623fd987ff5958550c962a193638679b79fcd477fdf2a09c0fa879bb22cb493fbaed27518f5cb265741535b4ab14246077ca18f11ece7aaa0e01ec5bf02c3c3b541ea08bf254df123079c1538e266dcd3161bf1b9ed41d873f1491906e1459ba51ac9dd95e783598d3c356e0cc5b98c2a96b148f55f102a9810181eedd46cd00b445d861baeeac46eba469435aa4ddc877bd68b53f4d005aa2566d356cc344aafcdc86abd774ea28cc838d2fdc541c4b6da494a96e128b8c2abab4b21b3ae2646cdcc3528ef6fd8587b3a0636ead67a62309fb003afdc14177d329b062622313e9dee912847763c68678df663a39b89c69efdb6d916d5754534bdca9030955cbcbae6fb7ff1df6282175cd37a30a904418b976af05809f0e0e7e4b4e2ec018f1e9c6bcbe7a7822c8699669946f5e684671d63e68cc7c9cca2963945dc21c52232e6f83b1875b2bed7c80c37371a480a2e5255d49d390c3b2adfc695036ed91371cda7d79bdfbae464581f0b32942f03826aca17ab9da6ade4a778d310ec3da17fc3af426d21b347aee7c2db7b5e188e35714dc514e3a1c100e8595c9e0e4399ad796021976f077e5733ea535cc6daec2e371853dcb715fc366ea7d6b9a5b3509dccf5c2e1225e3a51de9f5bb9b6586b282a0b27a9ae7ae8f2be14ec677670241e384b462eecfde68957839b1327c9e5c622c0f67cdaf3845ddbe6f754401d720d6b6d5c061dc906bfa70fb76e1168c6ac1a25cabe8873c3c1e540ae44ae631a2638accd7951f368442dba7b38d0662ccb0140d1e4ca23f51de731a6f5adcf816c3235359afd607e58948da29a5f06c96b4312aee7d35ed4c2c811a58c5a196ac2f377d653d51cfccb5213c928955ac880b5fb1b91e88a52d5c217cbf78e071275fe626c230fded548b0f1667af1309149ff74c5542119d4e269fdc1b241d9f53e02e38e015b7c5c2d2ee623bcb4167e37edafddc7fadd642c20f81b454db1a3b578d527f124dbd1f3d99fdd1590256ae4e47c2e8b3bfe8708a0d5506d6ce8b130ce6b70028161454a5065e9925d75c0095dc24ba789489fa1e9236e25330ca1a45e61224ee027664f6589028a240961aff09187fb719ff3477b56427189b7b3c790b4031f6539c5e3a8a5d7fd99c2534ed1646920a43e7315bba98d59c51b337ba7a1b038006bb574df46830f96a5685e07ee8a0a41e712810faacfb231c67e69d0fc24b98d782c70e15524d5d2dcf4e64b4e26772dfa7067f6dc7ffc8b06e6ef3ecb13f927d466e0cd3a7ea09aaed90b7810bbfdcd8a1274bbe78a453ffff11ccee62059ec25955b34a1a1cdf8a3e506d99dcbadf16032646117556ad71cd93ceeec42be0350a6c9f194fea783558c42a56d034dcaf6fb1b28037362c7c6e2446bcda71d0a88adda3144589447ef13cb85a4d2cd16ef444097bc03e32c3b1a055e952f7ac87078b04deb900375a16dbd382ea4375ddc0a9645deca620590337e803ea8b41337f3f4e4030119a2337424dbea3d21214063ce853843dd4e6df94e3dc3bbb36d89d9eb8e15e52d0699bc6ad1de9d12afc95c8785d63756576d357126e13b25502d542774f6e5d2fdb559d52698d08600fd05aa5d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee00000000000000010000000002faf080ab009f4d0b317a141e5b3f865599676f895834400b66dd09d33ad27163ca176f00061b1000028fe56ab181f454372c939ca0516f5782b26cec2010885c70e55c41a1e43de3af6635d2ed0bed90837cefa9f1805f4808e8092a4d44efe5fb616ff7678487a460b367134fcc728ba273fb1d22718bc6a95e47a120a6d952c7c2cb8f38e59c2a4efa63977cced7e4b8f46e4d47d29098a73beee807c3337c4acddcbb32b78eddbd124b2f33ec6cd8bdd364aa4ad2c10eb69dab808fe5f5f0aec19750e51ac65a8746f345c05d4b8823ffbeadd6200ad01449c39a008fbe117a8ee904445488811336d0c439419fa4f285f9f62a34f10b076c99c0092968e3cc9fa656016b6da049bd56b910d7a9356e76d24e746b280f0275ec9e9bace82d852bf0a137ea02d4cbd3b68450bfb593564d8c20953bb758890a55a8c381a4b3303b61ec26a56111361bf7262b3f6f2503aad06758130d86ea607cdbba53415aaf253430d92fdd81c685ab39233e94654e6508eec1347747e2df2862169382aef6f99dd78b50629c5d98b1fcc73e865679d862b42f8e9d54ef6288ed2c3f2713f0fa4db538cd3e70ec1a30cd65dbf873f581b30892acedacd39b5f0aa774d1f3f77d8fd11ed628bcd02ac33f89123595aa455ec54a07e93e26f94338fedd8bb84094a0add52f912ed5f9019e3a28d90d251cc6ed7ffd35254dcadd9f1e9b28eb0e06fd4fe961d60cb690a7757f475c08aef07c2e54668121540a42a9c779623709a2124629e8c4bd4021763979647f625b360a4559dfd3f57798dfe5d36e9d902904af3ed67d8f4b0894538c7718f5160d211cec27375a7e6a2ec42f2c8fcd1c953b7b8379d42439a2c6b921a66d5102ceb6bd6bc20b17098e69a0a4f708b42520e4792474c3d115a12c83ef60ac6e69d8842c5981e9a6d178efa352e73e4a34bed4fb590dbeecb259617668e6ffb9f955297f26e3a6a3b95d9617529a61f08666ca1069d2ee1876337d3e786244c5bb45a8236577184584cf3018118d7e4e78973ee510b6773bd922797e580cd240dea3ca31892d23c1e6e4fa92f1a01da8ea40044f5613a9429ebe7906f79b32636204d025115810b376d4c6436da136b96c7c10649e3290caecd6ca14d995a817e3725fee7e621c5366f80c752e50aeffee1af3361924f31cbb1cb44731d19963ff30127ca2363ce15e50948be14c43400737ee8910ed06027599da74b06e77eb82ac523cc031c57c02dd82dbc0d53629d072615c92034cf829e7a5d4437b1f58e2bd4b16993e1e1b05c26ed8d695351db11d21df36a7f5811ef5fe001ab1e1c6ce9d2b69b6ac3af8087e6666317f75b645e3b1caefac0eb65327fcb9fa62be341c99f191cc869e48dbc8fee3e42d4393cbc6505c880dd6739a69be4f7ef3de306480a7a51f413d310926f252ea96a0c772d8b8e94e7d6cedbfbdb21fae2ffc379eb17c2680fa2bc56a8726c93e7bf2d446221ce95e49da93d29bec8e53ddcfd262c33d556c2b8921c3de93236408b462d28612d3343fbb9cc538b1e6b33c341c3b91dd41f936931e61f146fd00aee1c5c0de97b47cf7efce889012e1c22dd8faf0fe155f4e9930c27941d8b0907502a835bfffff801f6835de69ad33e95232f773219eec0e2374c421230f323257dbc91629c4ca8a61584f737b827fe8e8f5b69b88a7b64b362f8142b043f08ea82c4a0ab7c4e0b9805533e806f90597095242ff64f314801fb7ad838e98e1859b2c05c9b027ae5a4baf780d15977bc1492dee9b14b1cb0fb3243eb2304919486fcde89a3cf35a64e31b1698e35fbb8528a73526a19189d406272b8becec94379f69372afa99d06bb4f34df72e1c3b49557855ae8ac265160bdf48ab34cde30d2665891cfeda24adcc657d851431f38953f917f1a111f023d2c71845ccf25a562d2450bf8b4986b64ae4fd09e5a8ab9610d11fd68e9d570b3a467780236de974c7fffd05aa5d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee000000000000000200000000000f4240657c0bd97e795218aa623b27cf9a71764379c4762fcee8993aa0b1ab1e32194a00061b100002c0ec5d388a8c78491bbd870faa2c46e4282e11796123b69c2792e5806748ef068397f0212a33e3f79162ba4ea247ccec410db039dd323af48ac27bd0ba77ecb870c587477d4543d9a29c53fc02bc98d7cd0144c7abf80b999c22b42a28ae8d625478ca304001f9a49782ec970031e673c76e4e27357a321729d6df38d1d88dcbf764c69eda3baac9739bed637010f44638cfe1deecc56b76f6e02d1d0c3f104462b9ffa5f20de4cf092d86a5bb35d5f62b0fb1c983a2c06df17c9ffc809c83e4b4335f5903fab536fbd9719847bb063541ecbe05c12ef8d058b3547faca054e3d662250f1cc1f925dd71297abc25fe37ab33a086759fac76208a64552f84d2e4d84daccdc3aa2bbd2c2f922bf262596742dfe034529d1ead2975dd3d197ab0e2e1c75c8b8f160ca6077638022d4afbd107979949cf342cb399347f3990029f0db6d9ac0c569d61d42539371f9a7ff59e9c83ff97d15bf0eeb254ae58fb7b1f9d8710c546ac8a227930c66ac841bc4f475229e5cadd14ba5a01e6b2da99c55861a08e2100e62c4499d30003fe30ddaa347d7a27c2158d3787d58fe51ae57d797bbef7f900508d1580df3e5233f0887567fba1faa918c246d2ec5c3b7aa022cb8a652d00b4d719e312482f57655eee80a90cdc73151fd7ab9c5367793d60c6088fab98f0547d7f547e10db202a25e027a5cd0abc41bb0e3ef563c0a6d469a702b2a26f0e8b4fddb845a16a5f06b9dee33c3adb31430c94942c5023179d3e4441948a332069a1c3b69dca65f05a43452e42fd28a2f7e6344f98ab9a7e4eece3c1709be1f7bb620f8b6c45989a8bccad39a4bf40e8215183d1449196f1f9fc17de778b616856152e6e6145a1b7a3d7f226becaea5ebe34aa4bd06e60f0fed207bfd21f5663bfadd37dd722437bcd46a26fb4e19d062574a81bcd817eecbc1914a5878809128961acdd73113ae9c51070ff4494e16d81ccec777eeb513da82bf43d4884812b26546b4370dc315793271b069f60f4285f648cf122ed8b22b0c7a27e94ccd59a273eb774c109e19980e146850de95f82cdd8aa0e82022672024c917b281422d284df0ee0bdeb3d4ac56b4ca675ebdb835c17b6a822d79ae7310f4aa41d80ac61c5e45c1c0e1d64542622a31091a9f87c335e86d964dd85a951d7c9bf41c9f2b1a9bb8424d7d1b26413da8034182fa42d2b1cd1f8745482c49d8348d19c72cf5a02bd28e4cba82128af8bf5d9c1215c4f543ef4d185f100f8d803dfa29c300c072e44ad9542b82fb1380d55c15c9a4b4398876e2450b90b49990746f339abca8cc8a462b62329a128758ce0e46b5f998af1bb485a3044bd125424eb5c623afd2a11befe4ec544eafe275ed1ad82b940dad5e9a9710d48562e51b296ba81f2d70593685ba0e3f3b25089a187e61d5675dd481aa99620276cb0a841a3c4df201a929287b1127270c5d25d06fb286dae1a9a5a5cdb60003f0c30d2021074bf252e550685f7b51a087a77b0871e883104e55f898aa5bc4cf8538c293253a737556d7f220e15b90cf0eda7d5f2172372e3c50c12cc588f312da37191b5038e944825044b130bff281ecd47a4252a1411ab7a9305c2b37e9facd435e9c434de37641498f8e4bfa7b42966da29c84200aca87ea1c3b00db54906b340e524a7dc4a15403bb82bc24517cb91026096bdf18f5f7ae5640ed6de1f0c5d184813d6b9d244b32b58e9ff524741a39383eec3a530d60db13deb26e3523a725f0599b671b625c07002704fb600b77318417d2527537359d122e22a1f7581eaebdc19e65ba50bdda18ae08e9a8694fcb0ff1a2cd98d910dbcd52064c15a4282d67b278c72a0fdbf228abf6b519dd28ac21c57d1da4bb7ad5b5ab10da6b83132df1da79ccfc77fb45598bbd91ef5ab96d8a2ee148639a562debafffd05aa5d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee00000000000000000000000002faf08011b29e60a38883a8d4434f17ca3d92161109f7ddd8799e64e86d6b8509babd1100061b100003b8c1771721551fa88af8fdde92909add6e5b8fa90a4b0484ee065ed3ed7c56e733a7fcd775d4ab92956c1328ffee9c195004c5dee5dd5b9d0f9034589e6769e72579d3d5837ad70785ec420b4a24c04d36668728c0d2534ff1feea9aac2410423fd79c7db9231ee7efd3d585646e378fe53d731d18f38d6356a970f5c3026edc849d49ff34e58dfb7548512461110088ac3aa800e10785029ba3b0e9ab7bde0f056939e4921792dba2f5c005135daf57e32cae06a9ccb1b4d321f3ba015e5b92def1ff1c200e56b3990d82570586bfae26e9398e17dc6c069f92d80e6dfedf6b2f24b1dc3cc9d63e684d861f40fdbf508d4ac34b7f10c57be2a9b0c5921f86869c29ada5394b8780d2488a4fca3cd98ddb0ff8ea4415a07caea436682835744e94d5cff6d3024a9525dbd697e499b7ef23062b18b225bfaa4c5bb07166f34ff7866ec8f0fbbc12f695c609692798364fa20bf7977e321deda3fe5510833494532fba94fc1f0dd14ec74f3e9fe8ee659634621b63d16d46a8958132c24bd82c516bdf9ae9515cebae42778e4de6be7047c31cf86c0df0306f7b6562e1f35be51e5e64cc6d9d4c010849e6ac7ddacaa4b7b6fb1d35aac815964090940e73a1193eece11c1c1d37e373ef58c5e2d690b6ed6338360af9906146da9db8329bd2786bbf92df10445ee093f0b1b2a640cc2daf003fa7141435ba1dd54f9cdbf5417fa7f539b255452852a85d2ce97ce5abed4980e7b409e283f97ccc9c01e104b55155f96ace6789f61c4661962d34fc5d7e6f5f5233180933b2fa7f7a5b074714645489f5221966160946b7bfbf0fe6733e6beb8af4457b9d36cde1200811009ec483a9d730ca980aa28f636942af5e89794a8edbc1b75d555ba134974374d0fe23d31c26566064eb9998d649bb2bf066bf710da50672f4e3ab4df843a0c8942bad0a071c237d4c1759eca37380919e36aec73284db202a32d3d1619f3e5b757b2df8b04bde567783dc8e465d996799782f1a1b8de9331681a35aa04edb427de87264c8ae9c397f29d3e8730db91256425a10b960a9de1a48d0d4186d617d2b69c87e2540f6570faff4ee1f6303d7d281434947abeaad83c86a4d25bef4de2bb3c6104aa0ceed7c8df039f4be6a42851a118adb1b8f98e02f6727b75d98541bab2ff24fb2f20342e86150c678941825409b62a844f44ca1ccdf0d9f7c2cf9b222fbed00bc92be0802fbfbbeefa71c8976cba8fc4aeb031480f434027b1cd593d08cbc14c2a360b736b06b5afb8da35f0be3818fff4275b8c830f5248a8b8edea1327454e1360bd90d4fa08e965f459b0b027e1180290cf762f813a31e8109f472d9657b03af737d1f7bd2e59441541a84ba818f1413c5cd1f8b9882e9188e0def9e44e2f4a7c710c893c7188ba86423f8ae86068d84e1832af548289e87c34d68b186df7e24ca5b051f8f5e4a44e2e7383ba2a09615b4147b34e86486731290ea67f3be24c13a9c5cc37f06555989b3f10c580a9cd2b416d0ee4210855c6833a25996761dfabb036f3893cff7db7e310baa8faa79f46e0ee43bf4dfd732eae7f44bad2e7c032b9c6d14947af6b0e37e5ec98372a622f716ffba0cde04b9d4508392dd154ddc34829412bfa604d4f00e4b10a553587343ef5c0944165e7ee1e34387b09c147ecba943cf36dbc4269efe50ec3a5a3075c43be9651d6db6acb9f657476952b78c990557f05935247a71077373ec436ec586def177448f8859ba096b7a838e5b4ce7a463f9082f705c26d99936eb1be584ea9b58a44b9b4faa07fd8247fa66cf4529d1b8cdb92ed7bd96bf0968db4376489c7d46f0f27d58ac884c29736502953723ef1ab41e19c7041d3e0e9091d7de2e3904d032de02292edb1225a672ab438d3c65f7921c06a9f181f8ffda4ac524d0e000fd05aa5d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee000000000000000000000000000493e0f81fd474bea478df0202b311c69e85dc6215f629491dd15ad0929faae2535abb00061b10000370b2714d2734e6b8cde085794dd7b41c8a9b6c03c1edd8e3db168ee7fce39493596e882b18b5b1b79c16400c6762b9856075821be6be9fab8f469f56820d8f341554400a8da7f1f1a8501902581d43b9fa6e5c68015716f718a2190b87fce41bf1b509aa61806394a42489d63c457fe4c79e7480eced1315edd731887e57704fc9102f50cb7f0d242d755cfd5a2172dbaf7f01b124861cc6d1dc804796bbb84165c805f0c0f3fb9ec97b74c2a694de56a9cf8d79d1a679260ee1169d78214b34c8a654ba22e59ddcd32beff4713de33549f035b342660405b0159a7a508e5691ef4805689140e72b8a0ef2e61be74dea5d0b8f5589e0e373cac2e2e1cc39b2121c05cf4122ad0f8b9af6fbf1de2ea26376c2650ccd306c13a7b64acbf2a3feed128754abe44658009e642768ae3d84f5e0fa5f7f360c2a1c76d26985817ae77b71fb59014a5483ebba9271cafa5e5d8031c569adeceb8bae6444e98d2522b28f6682109fc7d31cdb83ebd45e5d81e7f046df42345b49f470dbef9ed87709301d2c6131215d33a30b8d18e63e54a2aff85dd57672f8198bca6a67ee147c7d0ae649e5661ab6bf78a662fef9a164f1e332b9f16e6fb3d5769ddcbc1d1c07338d3394b9245d17618c2474e86c064fca4df00ad3a93dc051fd8c3328cde2a987798b0f22a21c90426700abeb1e6f38dffb485b5477ec44c690fa80e317b32a982fd3082253bba8595783290dbffee4fc9296ffdf16a8bf3154971bb720e78674969e9db2e0fbab9e9e13f24bc8b3af5e2f00f262f0da56de443f70398ab68f747d35370fcd8e1c0e130f7269e08f862b5a67f2c129be254df2358762ce3a947eb27d66450af51540e7721b47c8a5a86098ea64dad381f14e07aabbbc470949a99c07612add3ab4c575fe2e520bbe511a1a674aea37a44535c13ee3380f8f39bd230fc1481cd31912af36c6751e23c6f383cd37a8b13fa7df9f0c7e460739f2c6226638ee14f14d36366211cbc6a1e16b4856bf302a540aa9d9e833b1d59c510473096384c8b450f2f3f1dab9e614af822949d5cc93d76bc4d1a52891bc85f1981ef83161195ab7d8181ee4fb163bc6c685a10e87c7f4b15ed7d05833c230a4a5b63841fc65b959f0ff010e697f47c583f9b7fa9b389c0eff6614e47d85b83c483136f182be4c151d272f5d938b912a95e47d333e5de6a409ad271679a778a7eb3f169c71525302fac5d4575e2645c09763c2ef165736a7a726ca605038e2781404328790ffaacef2b9c2bf90122042cd571287bc4e3973da65fbd4e3da9e40e4347ca6eb4ef1ffef4e5a34be80425cae3e81533f7f2953f95fca53a22057a39125f5c76350fba7fc6c036838fb951d0aa8702e7f44c6f8a9cbce3b64fa8ddc2bb8c8b35d1e29a21beda6fdd332b31a749321455277231fd9d70ea4aded95053b395f88fa6916d126e1626fc0f1be6cd2a9538d17c498b40927f12b3bb40fa3e272e82cd2242b670afefa387470f4e6e0a1236028954c9e90311f486617187956a23b90b356d71e219e6dd055c2120771003a6c12769aa3ceacb9642bc01022731ca7a413b68ee7d1d5444f75dfa51a68b74a01ac85f6ceaf5e56987b9d67d6de896f5aafd25c78c413a6d4b5b03d571167524cd231ba13bd9f80fd7413faf21e8170cef0d08b242c5c38a2b0158da56e358ba0692f670d4611c7a3624b234adc30c5b7198e0afc941f5d13eae3a94ddffa652c784c34c582e04e948da91a5ac3038a9df38fd4f1733779f4f122ca2d7ff9d03bac9def35d9ee3a183161f8f2808d472b2e64581209359cea58ca7757164c666029982223877e2b14d2d537afb012f1ffc12cd083c16dfc64213c56f3d4d22b603d3dfab1d21e239d6fc1f9f153ed61f1ac91c29c85c16f4aa2985f84052f5a08d32bdd000027100000000008af34a0000000002c2322200183cab01341b3b937dc48c2d5d70e119b4fd5b4dc6d85e0bb49e98f1fe4ed87027bb80c7d8cec36237511da378ad5c121861660506bdf411240139e49a93e13aee25d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee270248e28af5950cd59a64545f84957e4cd869de45b4fb50b85313894a1567c134666207e5bec5803b71d6fd6a9cfea3e6ea9a8dfe645a7f4dc7c9cd6c4ce15a0002547bca65416a28af342589b5b771ce54464b17b2153b49a1d34a2ed0b0788ec37083e54750e6f368b4a40d18a8730522e8f23901ac856b697dbd91992d75e097e3f175514453a79521d93ca8b3ffed47cbe300afdd75d1dd23cbe0c14cf67b3856fbe2128b9b7543625f1da313516f7e441255f85e341371fb7f33c6833abf02000000000000000100245d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee000000002b40420f0000000000220020c57347ca54a9e6f279f6a1f1e50f19b48289c3baccdd356fb03033ae7ccb6e444752210252a01d9d8b03db1a99b1a82223f7dd60ecffa69dbef47c06228fdea2fe0f0215210322a747c1d7f77fc7577a689618bbeadf28b941412404ac5e216d684a32d57a8e52ae000100400000ffffffffffff0020cd6d4a4bf51a8c36a25cde5bc08188c5ae037fd9ad9e92b400bb3d10e473b55480007fffffffffff805d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee061a8000002a00000000883a86353a00c855b5caa13998033c04330f88b88e084b3c00f228299e5554f0b66e9d5c630e194cd572acaee6e5124b612583b9722ccf24581716292785c4925c06226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f061a8000002a000060535ae20101009000000000000003e8000854d00000000a000000003b9aca000000" - val dataWaitForFundingConfirmed = hex"01002000000001039dc0e0b1d25905e44fdf6f8e89755a5e219685840d0bc1d28d3308f9628a3585000967c455a833a6f008c44e812a823c885366375989326c0ea49bb8d09c4ebd1e2c8000000000000000000003e8ffffffffffffffff0000000000004e2000000000000003e80090001e00160014f2c1f8aafa8640b0c0f956f06d03345911fa48f600000003028a8203af0ed6052cf28d670665549bc86f4b721c9fdb309d40c58f5811f63966e005d0000000000000044c0000000008f0d180000000000000271000000000000000000090006402f3244dc6ef79947a85330d51267925a23c291045abe050f425987ef5fcd2c44602c0908a5f652ce9ea80474427392f63b100608fadf4d88b80ca3b3a523ea14b21036012a17d10bebf5efa7da52fd794641d6cc605561f670aa6af7df55676a53809033a13125fc72f17e257f3c5275c4e6639c3a0829d304ecf53f751e289d02db008024882597bf6360b6b977b54b7a352ec260ac0078a17a94b453fcf2c0b4c74c29e0000186b0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028a82000000000000000000000000002710000000000bebc200000000002faf080024fe3aad7e575f558a4c29f2b81eb29f714ad42ee900c29ba8cdd7cf15e2567395000000002b40420f00000000002200202267351a35ae5073ea116aa05994c46cf2e01fb439380592518b03118ffde13747522102a3ba089e05c0d0cee8e90299e75c9908ca9f435f989ffdea26c208e6d745a7072102f3244dc6ef79947a85330d51267925a23c291045abe050f425987ef5fcd2c44652aefd015a02000000000101fe3aad7e575f558a4c29f2b81eb29f714ad42ee900c29ba8cdd7cf15e256739500000000001fa63c8002400d030000000000220020745b5a9e4b754f1667cb207b4afbfbd4713d191eb7cdb8abbf43ade59d247a4fb8180c00000000001600148e64399bd249c32f61fe6b7faaf81348e5ff82640400483045022100adb344fe13d3fc60b67d7d1ed8c8c8d4cf25214428deb8e421ac0453c153169c022025d4ed4f1c0b15de5d862478dc57ae8e3a301503e1a8d491cbba4726688eda5f01473044022048d5c4de2db5674107386eb499374a7184a493d2102998b4dfba2a4e1308ef1c022060b751f522600681d939c840c89da6a856c71353d9716bcd869148ff53a5caeb0147522102a3ba089e05c0d0cee8e90299e75c9908ca9f435f989ffdea26c208e6d745a7072102f3244dc6ef79947a85330d51267925a23c291045abe050f425987ef5fcd2c44652aed5f2bd2000000000000000000000000000002710000000002faf0800000000000bebc20079eb45fef7b8c8d1de96e25b675af76d513fcd522e19004eb0fea7a522bed6e7029415176453cf3e9a56ed7c1057d06c05c1127b54ce6520ed30cc35b9716ae66c000000000000000000000000000000000000000000000000000000000000ff0376bfdc6c3df837471e8ddff90fdb5e3690628179e0b25223c750824c649a9baa24fe3aad7e575f558a4c29f2b81eb29f714ad42ee900c29ba8cdd7cf15e2567395000000002b40420f00000000002200202267351a35ae5073ea116aa05994c46cf2e01fb439380592518b03118ffde13747522102a3ba089e05c0d0cee8e90299e75c9908ca9f435f989ffdea26c208e6d745a7072102f3244dc6ef79947a85330d51267925a23c291045abe050f425987ef5fcd2c44652ae000000fe3aad7e575f558a4c29f2b81eb29f714ad42ee900c29ba8cdd7cf15e2567395000000000000061a8000ff60fe3aad7e575f558a4c29f2b81eb29f714ad42ee900c29ba8cdd7cf15e256739537e8811edcf85b8dfa3c248aaac5f254c69425670bd46c3adced6ced6794452f2032301da9dee126d7929951721d05755a4da9a31ae1643a1fa9a28d377dbd9f" val dataShutdown = hex"0100230000000103af0ed6052cf28d670665549bc86f4b721c9fdb309d40c58f5811f63966e005d000090cc78408b6ea14d14bab8c89a4e1e0cbdc4cb4645f9c3a6457b0bed5788c389a80000001000000000000044c0000000008f0d1800000000000002710000000000000000000900064ff1600146663df19ca3fcc1c04447b18d2cd795c485f19410000186b0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028a82039dc0e0b1d25905e44fdf6f8e89755a5e219685840d0bc1d28d3308f9628a358500000000000003e8ffffffffffffffff0000000000004e2000000000000003e80090001e0386998d8c3ecc235c80eb4605ec24c5192d27ddef57d204227d3ac0c54547312c02c02cf88a39307d6e9aa4ba00bda029ab3cd426316eb63c186875c3a5d80969500381d707ac8494a96e1e8b8bf4a3a703a78358c69856f4741dda173d9f9448219303d6ba71bae191ee8d282e57d3a7793919d621b9e2df77dcafe45a5cdb913784f80203212eea182f9f5d5666a54b3e96a7525a48d5b9ee0f9a160d13926480cb9fbe00000003028a82000000000000000001000200fd05aa9eb27b82a5de32ca44c8d8e38e705c62f5f4d3b945dfb5f03973dae05fa4388500000000000000000000000011e1a3000a00cedece5db1cf150c39b679dd048140f491a72e93196f9e205841a23791c500061b100003f2b3c9277a3dd9ee0fd08afce183d75f570299155a8dc5c1c5acc79a572629c37ee817bee5023531eb3929c8e95025deb4600cb6ccb900176a23ed7cc35f99f7266ec8b0e59f8e0c0150916c2533133bfd105e883ed7b33915f7a532e36d46db78a2842d7e99f1f8abc863a5f6f8866b130025610795266d8a9603a8ae11ee23ca765f9a82ef00686612da9f70c2b2c2ba242bcaa9e3d95e542cbe59461a75e5a8f01553da2552d363593b8a85bc546f17f8e8bdd1449602fe3f46ed566e42a4155cf0b6c26df2cc5a8312ebebaa6bf11df9a55aaad2a96cdf41d7e70e815b7457c9332cc58ae9de3b9f52da71e7f328afa8de7777c76ea82e17e4a2cb46c3669ccc5f644414764019bcb2d4069c3e7a29814f0462abe479804d4dcceb498f1da52d5796f69f7d1d235e2da967e8683f77e7f206034ab12c02aba8554ece3444f8e0803df9ba5a9b1b918f13d94fd89235e1e2ec32df3154b204bb7642d33112ce70ef5384b11cf07bcace83a97339e1f9fb33e4b2cf1ccd62cb5311ab2124a8ed33a6c95c49ec90d9a477f3556d098a39235e8f1b904ed7aec0052deb3173f5d85126bf90271c567f3e9a10c12bc50f37f41ae40b49c71cf74cf18cb6e5eac206cc596349503f913178dcb3ee4ec5410b30474a4a2831b18ac07cb78fc143e056aee802aaa8bfd5d97e403e718069b221e3effcd57accfd13bb61d4eb78e98f269e79062c414a9e0b39075d8baf371c0fe09aaed436445d62664de1a96e8c974a3fe0cc045dab3064c7601dda9213d89b8fe30437f0b5cffa296bce9c141e3c012502431ff0cd5cde95eb52f9dc78ce3fca95b6a75de178ed13f9e3e7610cdbd1a1a893dd635e07459aae22a8f8c5bfc0a33a1f88fdcc1b99173080b602f91f1c9549b235e21bfc4ca071e0070f0057d65d98343cd82035970f6d75fc9a4b191270d83cb0dc6aa84238567e230bb68d16b0bba3563a28d151b308a74766eac50d4b4b287e1f46230ed1c4e8259cefdbba86c367392097909a740f692b745bb8c4809115ddd42de543dac65245faa6870f25aa2df16118d6bee2be181789ab64e5ba727048eeda81e6a90995c681924b2f807554401b6aef9436a345253be21747c313e8d9e2bf048d890350c055016cc61a06dc082a2b2c1b038405248ce18bd5037afa0e04b704198d6129da78ef9b97a8cee66a1104acd89c2bb2ab57d519f6693fd94fbabbca63fb9bd29decd9dacb34000f0f40af6969577f37a9aa38b4f2cb3d5d974a3d53440e78aa7ba013ac9a242be930e819ec36a96850cd7c630ea102fab614f81a4c9b9a01e60aaf9956a4f109cf5496ac8a43d03b0802303a6fe515199f9dfd4e66c2eac124d4653e999702832073f75ebc177fffc3efd404141927b3635980a40ee6ae50ff14010ad8e21493a38e4930a82b9d636d7115a55511bf4296d80ea8105a07f65730db9315a084600be9a3dd2b19943fa7cc85d2293de47f7799459288caa8d40c55605b5abfdfbf1325d0ea90aba749b0a625847f4b006ff34b6c9bd14a1c107c8a0175983ad10ae47a285b7d503e870625711fe3e1557377433ee845e2254c538304a97850e5acd2d4ba14241630b026230ed508b84f9442d6fb9a45369e2cbbd0d494cfa2573d4a0e553c0013ecb33d44f2395e4e4a3f752b8f86955061eecf4a9f9fed27648446369a8dcae2e6ae0b51b9a4fe315ad5c7521764738cb591734b32a8e35c1d6c80d9202aacdbf65cc243ba0640f8f8c23d637d7331c5b9f4c44fa5f2858cf2d74937beb4b345d22c2614bb6346f38933f84aea2bd5456505709fd8b5335fbe54e99c351e151f1f209dcac9e37742d3978c9a95eed0b29fc0b4150229a0990f465bd3bbcf97f73237961042359aaa0f11b1bc4c572de165a6372f3f438e7071a19700fd05aa9eb27b82a5de32ca44c8d8e38e705c62f5f4d3b945dfb5f03973dae05fa438850000000000000001000000000bebc200a043ffa6f358e330873add2e0d4f05a72150cc831bb2f1062e5c378b9bced8e800061b1000025eacbc7939a2307c66fa4841480bc6c87f041d1bf722da78bf13983d485df3fece09e54b1fb1534dee2931eb75f0bb95f21e924e565e8e5b06dd16a9fd4868fe60295bcfee2f6c53481a13c9e49d468a8c6992aca5464619ee54f052f5cb2a6a4ed6abeb6951d22ccd0662816882497d6c8fcfe64152e6a9b6ab15bdcb43545fc3f2fe9caf2679f5705fb68b90f8dd1579b9346901dc16923d222125652c8b15b5e003f660fc1af452ee0edb61b67272a3369ffeb3671f2bfacaf3b9452db611760d95c734151639733adcf7dcd2ab7a298d7dd0d31c61004be368b9858d19907eb76b421e3524d83d4a2dff76c73abc0de61114f6c7d61622074e719b729c52e9b11f65e8260e90f66e71de5686c89da73e9b1001541d621663c3613eb4ce2faf7f9ae94f0f17047e3b283baf98145936ff491c6c031a2059e2c52a7725f0790943bdd21ecd3e237000fa8bf27e81343902489101dd96f2a9bd6cc1cb9c4f4a9bf33ec39b0743901f8bec541fe9090d984d9c071eca64ee9fb4996564cad02923c0a662db9b42d76bacb09314c6bae42077ddab05905a02f3cbab41fb6a9e8c1ed2b27b5052ced38f4192cd97e0b9747f219f2484b46add32e937fd7f8fd8098aa2147e3e1400226703860766549868d719a8c372fad4ea7c8256908ba2865c68683a2cc28436b1effcd6e5ad990b83824181fc80a576f8906a45f56ce7e3748ad4a4385143768876d1e73ad962eeb6a2466f42573da8cf4a082997ffb87efc7f2711b92af0b36a72f1157c0df404aef2f958b32100991574ef4593f134d680e1a87729a577d7432b3e2ccfde6fde5334cedb8b601a07932f2f63835705e480e57f92b51e4a08ec44e07157bf6f80095fe908637d569708779eaf5b9be3c33e0dd9b840c3e1ef3cba0a0bbb868b4f07b5abb934fcf5d47d3511941a32e54ab5d4c547b81708dd5a876d3667f8447e6819625f49ac1e8f8bfd9df2b190aa318927d212c964a5b8b36c2a94d7543c8d94c4e2a1a43824cf652873ddbbdd321b473640f0982cbcea32288c6ecd2272e57cdcc20a9bd60a760de289bd86cdcf590cc7118e407ecd369412e544cc1d256e177fadc3fb15d8238199782aeadea3f33558dd68ff042d9cb440f556132dae1fbcef3e693691b089939883ca0e8c94a630d45c6adc33201cb274ee3f3225cd2a835b4b83e0a319eba92cc2bf728f6e5bcb786ccf8ca7c42e6fd2a9d7941580a8f7983a6d9d88ffa6ada598ef4571d6d5ff67917f43bff4df2330081244bd3fbaefb21b6a8d14ab81846824379415c186726d20afcdd298b921bb850eab4bdd188d72dd42d6f1a211b580e0ca831c2443f7f50eb911ac3b3100513be666b3a48be024471f92e1689909392670c0f3d7f937ec318ff9a1f1fc147597e49e735978abe5ebc1c1fb6474acbb610af539c57a248fbaa8909587418a15e536a53801736ea27b120e43a070a8e2f402ce744d71c2f81caa3a23a669462c1e0012009c0201b9cfc5b01a78b26c2acd939c1ebaa5e127b57c58078a79dec8bc206111e4cba54b645d0dda5e7cdeaf1f9e6374037f8ecc7d72d2802b0a5981f48c75b1f15ade54472450e0f16736902702e915117ba02344ed0d58bcc9f2e03fdcf6907812a3655dfc07602144a16e5e1cbcf3629a8bb274f8c1652db6cbe12bab258d574181c94a8972392428a0bafd1c021bfe42df0a942f87c112c8bc340bd518b3cce475e481b7006e266065ca620d70923dadcc7518df79198990ac8e7d99f066eba8bcfb2992515f5cbf2da8ef55b19fac4418309cf7bd237cb69b1d7c6a3c6b456f1ee228b3e9fbaf1b3cadddfaa307039dff33ad59bcfe44851c33fd09346e5791adf0b0a846326266756fa5a035a840e79ff0fc1735b04a4f611da1c29f9ca64a0a9d1d07bd000027100000000011e1a300000000000bebc200249eb27b82a5de32ca44c8d8e38e705c62f5f4d3b945dfb5f03973dae05fa43885000000002b40420f00000000002200207f89b60332c0a813268782be20d14c67626b76aa4832e1b9726c57a01750bc83475221032edd70e88cbfcda8c91eb9b20ff6a2c569a52de908933b048bf6b8414d7667b7210386998d8c3ecc235c80eb4605ec24c5192d27ddef57d204227d3ac0c54547312c52aefd01af020000000001019eb27b82a5de32ca44c8d8e38e705c62f5f4d3b945dfb5f03973dae05fa438850000000000d2a9188004400d030000000000160014a203180611650c5e77e05d64ff0d794aa4ad35ae400d030000000000220020fea2002eacc21b3490a177df4ee69f30c231d919b99e0b32bf518767169aa764286a040000000000220020f757d7d804dfbc35427f8bffb749454a114be5055a683d08ea66581d1e51dcfce093040000000000220020e518e9c7e70e16eb89facff2af3f233e1af45d8a6d04ae7f36f4fffeadcf3e1604004730440220203be2c76c9d051b47db6da5a99ce689eff53ce5bf016f1d9ac403ab7c9fc9a40220290da75c0701cc212ac502d3d894801e92a701a20a4e85c3f640f579f96762e001473044022006c47ea4c15c389369ff75d25b83770396920a1f06a2c468ce56a32f9cb7cded0220759b6227e0da03ab542187f482b9f6123c93e3187070de646b07547e7493e8ce01475221032edd70e88cbfcda8c91eb9b20ff6a2c569a52de908933b048bf6b8414d7667b7210386998d8c3ecc235c80eb4605ec24c5192d27ddef57d204227d3ac0c54547312c52ae08758b200002000324cd3bf6d98e9f7f88be0e61167f9797164b578df264206f79a96e104cf4abd0e1010000002b400d030000000000220020fea2002eacc21b3490a177df4ee69f30c231d919b99e0b32bf518767169aa7648576a91490767756314724028f101050cd76819b6a1756368763ac672102551ddb3bbc7ea3a02cadba123a00b171d7b75ee46e7aaba9caf112012c77ab587c820120876475527c2103b89e41f7c1cefc7864881d9a78f262a9077a99cb05194684e48591bbffc0a5ce52ae67a9148acca5ea2fc12ce9d71ece802b1f500a7e84378d88ac68685e0200000001cd3bf6d98e9f7f88be0e61167f9797164b578df264206f79a96e104cf4abd0e1010000000000000000015af3020000000000220020f757d7d804dfbc35427f8bffb749454a114be5055a683d08ea66581d1e51dcfc101b0600402470f4a38f40a7d71f39f9552254c007ba5557adbec6ffa7176669fb309195d75a33b4556e6f35536757085c24fb83c09ecc1cdd976cb8d2b0bc679d461789d040db8c19bf05d1d55cbe50de7ce29c9388bb541f6397dc43f9452a92a931c76c42722ce6ad02d0343dde9b692e001349d9b1e075527f1a8d3d1aa90fc72164271a000324cd3bf6d98e9f7f88be0e61167f9797164b578df264206f79a96e104cf4abd0e1030000002be093040000000000220020e518e9c7e70e16eb89facff2af3f233e1af45d8a6d04ae7f36f4fffeadcf3e168576a91490767756314724028f101050cd76819b6a1756368763ac672102551ddb3bbc7ea3a02cadba123a00b171d7b75ee46e7aaba9caf112012c77ab587c820120876475527c2103b89e41f7c1cefc7864881d9a78f262a9077a99cb05194684e48591bbffc0a5ce52ae67a9144976a85ce7e37d8557d74cdd86254926d991f77b88ac68685e0200000001cd3bf6d98e9f7f88be0e61167f9797164b578df264206f79a96e104cf4abd0e103000000000000000001fa79040000000000220020f757d7d804dfbc35427f8bffb749454a114be5055a683d08ea66581d1e51dcfc101b06004062a64d249f7301aa354b7951f0c7b13882b7196e7985727395c624bdb84ab9234a5e0edbff3b5a5b12bd385a695722be5aef598ab36ec1eb605e944964a1adbd4061013fe37fb5d1ed7f8d8137501a755c195bd2bdcf345e30cac31c2962f4e0aa0614d7f96b9c49d8120089f2d24919ddf40bda3af04312f7d5255248075d28e200000000000000010002fffd05aa9eb27b82a5de32ca44c8d8e38e705c62f5f4d3b945dfb5f03973dae05fa4388500000000000000000000000011e1a3000a00cedece5db1cf150c39b679dd048140f491a72e93196f9e205841a23791c500061b100003f2b3c9277a3dd9ee0fd08afce183d75f570299155a8dc5c1c5acc79a572629c37ee817bee5023531eb3929c8e95025deb4600cb6ccb900176a23ed7cc35f99f7266ec8b0e59f8e0c0150916c2533133bfd105e883ed7b33915f7a532e36d46db78a2842d7e99f1f8abc863a5f6f8866b130025610795266d8a9603a8ae11ee23ca765f9a82ef00686612da9f70c2b2c2ba242bcaa9e3d95e542cbe59461a75e5a8f01553da2552d363593b8a85bc546f17f8e8bdd1449602fe3f46ed566e42a4155cf0b6c26df2cc5a8312ebebaa6bf11df9a55aaad2a96cdf41d7e70e815b7457c9332cc58ae9de3b9f52da71e7f328afa8de7777c76ea82e17e4a2cb46c3669ccc5f644414764019bcb2d4069c3e7a29814f0462abe479804d4dcceb498f1da52d5796f69f7d1d235e2da967e8683f77e7f206034ab12c02aba8554ece3444f8e0803df9ba5a9b1b918f13d94fd89235e1e2ec32df3154b204bb7642d33112ce70ef5384b11cf07bcace83a97339e1f9fb33e4b2cf1ccd62cb5311ab2124a8ed33a6c95c49ec90d9a477f3556d098a39235e8f1b904ed7aec0052deb3173f5d85126bf90271c567f3e9a10c12bc50f37f41ae40b49c71cf74cf18cb6e5eac206cc596349503f913178dcb3ee4ec5410b30474a4a2831b18ac07cb78fc143e056aee802aaa8bfd5d97e403e718069b221e3effcd57accfd13bb61d4eb78e98f269e79062c414a9e0b39075d8baf371c0fe09aaed436445d62664de1a96e8c974a3fe0cc045dab3064c7601dda9213d89b8fe30437f0b5cffa296bce9c141e3c012502431ff0cd5cde95eb52f9dc78ce3fca95b6a75de178ed13f9e3e7610cdbd1a1a893dd635e07459aae22a8f8c5bfc0a33a1f88fdcc1b99173080b602f91f1c9549b235e21bfc4ca071e0070f0057d65d98343cd82035970f6d75fc9a4b191270d83cb0dc6aa84238567e230bb68d16b0bba3563a28d151b308a74766eac50d4b4b287e1f46230ed1c4e8259cefdbba86c367392097909a740f692b745bb8c4809115ddd42de543dac65245faa6870f25aa2df16118d6bee2be181789ab64e5ba727048eeda81e6a90995c681924b2f807554401b6aef9436a345253be21747c313e8d9e2bf048d890350c055016cc61a06dc082a2b2c1b038405248ce18bd5037afa0e04b704198d6129da78ef9b97a8cee66a1104acd89c2bb2ab57d519f6693fd94fbabbca63fb9bd29decd9dacb34000f0f40af6969577f37a9aa38b4f2cb3d5d974a3d53440e78aa7ba013ac9a242be930e819ec36a96850cd7c630ea102fab614f81a4c9b9a01e60aaf9956a4f109cf5496ac8a43d03b0802303a6fe515199f9dfd4e66c2eac124d4653e999702832073f75ebc177fffc3efd404141927b3635980a40ee6ae50ff14010ad8e21493a38e4930a82b9d636d7115a55511bf4296d80ea8105a07f65730db9315a084600be9a3dd2b19943fa7cc85d2293de47f7799459288caa8d40c55605b5abfdfbf1325d0ea90aba749b0a625847f4b006ff34b6c9bd14a1c107c8a0175983ad10ae47a285b7d503e870625711fe3e1557377433ee845e2254c538304a97850e5acd2d4ba14241630b026230ed508b84f9442d6fb9a45369e2cbbd0d494cfa2573d4a0e553c0013ecb33d44f2395e4e4a3f752b8f86955061eecf4a9f9fed27648446369a8dcae2e6ae0b51b9a4fe315ad5c7521764738cb591734b32a8e35c1d6c80d9202aacdbf65cc243ba0640f8f8c23d637d7331c5b9f4c44fa5f2858cf2d74937beb4b345d22c2614bb6346f38933f84aea2bd5456505709fd8b5335fbe54e99c351e151f1f209dcac9e37742d3978c9a95eed0b29fc0b4150229a0990f465bd3bbcf97f73237961042359aaa0f11b1bc4c572de165a6372f3f438e7071a197fffd05aa9eb27b82a5de32ca44c8d8e38e705c62f5f4d3b945dfb5f03973dae05fa438850000000000000001000000000bebc200a043ffa6f358e330873add2e0d4f05a72150cc831bb2f1062e5c378b9bced8e800061b1000025eacbc7939a2307c66fa4841480bc6c87f041d1bf722da78bf13983d485df3fece09e54b1fb1534dee2931eb75f0bb95f21e924e565e8e5b06dd16a9fd4868fe60295bcfee2f6c53481a13c9e49d468a8c6992aca5464619ee54f052f5cb2a6a4ed6abeb6951d22ccd0662816882497d6c8fcfe64152e6a9b6ab15bdcb43545fc3f2fe9caf2679f5705fb68b90f8dd1579b9346901dc16923d222125652c8b15b5e003f660fc1af452ee0edb61b67272a3369ffeb3671f2bfacaf3b9452db611760d95c734151639733adcf7dcd2ab7a298d7dd0d31c61004be368b9858d19907eb76b421e3524d83d4a2dff76c73abc0de61114f6c7d61622074e719b729c52e9b11f65e8260e90f66e71de5686c89da73e9b1001541d621663c3613eb4ce2faf7f9ae94f0f17047e3b283baf98145936ff491c6c031a2059e2c52a7725f0790943bdd21ecd3e237000fa8bf27e81343902489101dd96f2a9bd6cc1cb9c4f4a9bf33ec39b0743901f8bec541fe9090d984d9c071eca64ee9fb4996564cad02923c0a662db9b42d76bacb09314c6bae42077ddab05905a02f3cbab41fb6a9e8c1ed2b27b5052ced38f4192cd97e0b9747f219f2484b46add32e937fd7f8fd8098aa2147e3e1400226703860766549868d719a8c372fad4ea7c8256908ba2865c68683a2cc28436b1effcd6e5ad990b83824181fc80a576f8906a45f56ce7e3748ad4a4385143768876d1e73ad962eeb6a2466f42573da8cf4a082997ffb87efc7f2711b92af0b36a72f1157c0df404aef2f958b32100991574ef4593f134d680e1a87729a577d7432b3e2ccfde6fde5334cedb8b601a07932f2f63835705e480e57f92b51e4a08ec44e07157bf6f80095fe908637d569708779eaf5b9be3c33e0dd9b840c3e1ef3cba0a0bbb868b4f07b5abb934fcf5d47d3511941a32e54ab5d4c547b81708dd5a876d3667f8447e6819625f49ac1e8f8bfd9df2b190aa318927d212c964a5b8b36c2a94d7543c8d94c4e2a1a43824cf652873ddbbdd321b473640f0982cbcea32288c6ecd2272e57cdcc20a9bd60a760de289bd86cdcf590cc7118e407ecd369412e544cc1d256e177fadc3fb15d8238199782aeadea3f33558dd68ff042d9cb440f556132dae1fbcef3e693691b089939883ca0e8c94a630d45c6adc33201cb274ee3f3225cd2a835b4b83e0a319eba92cc2bf728f6e5bcb786ccf8ca7c42e6fd2a9d7941580a8f7983a6d9d88ffa6ada598ef4571d6d5ff67917f43bff4df2330081244bd3fbaefb21b6a8d14ab81846824379415c186726d20afcdd298b921bb850eab4bdd188d72dd42d6f1a211b580e0ca831c2443f7f50eb911ac3b3100513be666b3a48be024471f92e1689909392670c0f3d7f937ec318ff9a1f1fc147597e49e735978abe5ebc1c1fb6474acbb610af539c57a248fbaa8909587418a15e536a53801736ea27b120e43a070a8e2f402ce744d71c2f81caa3a23a669462c1e0012009c0201b9cfc5b01a78b26c2acd939c1ebaa5e127b57c58078a79dec8bc206111e4cba54b645d0dda5e7cdeaf1f9e6374037f8ecc7d72d2802b0a5981f48c75b1f15ade54472450e0f16736902702e915117ba02344ed0d58bcc9f2e03fdcf6907812a3655dfc07602144a16e5e1cbcf3629a8bb274f8c1652db6cbe12bab258d574181c94a8972392428a0bafd1c021bfe42df0a942f87c112c8bc340bd518b3cce475e481b7006e266065ca620d70923dadcc7518df79198990ac8e7d99f066eba8bcfb2992515f5cbf2da8ef55b19fac4418309cf7bd237cb69b1d7c6a3c6b456f1ee228b3e9fbaf1b3cadddfaa307039dff33ad59bcfe44851c33fd09346e5791adf0b0a846326266756fa5a035a840e79ff0fc1735b04a4f611da1c29f9ca64a0a9d1d07bd00002710000000000bebc2000000000011e1a300f36f3bd94a6751ab579d9481cbe484dd6b1d2abba32bcc757aea07e70d0ea28c0226f5d9131a28e7d24ecc1b7fa2b63b34a379879f645d8e3346aea28f9ab603eb00000000000000000000000000000000000000020000000000000000000200000000000000000003ea1865f4cd884edcb9921736b2ae36b50000000000000001000384fe405b653143169925b03dd2cf38bdff034a0fd7fb350f7c089c1129dfb82cc772d5525d0b922cc3d989fcaec7c16b03c3249eb27b82a5de32ca44c8d8e38e705c62f5f4d3b945dfb5f03973dae05fa43885000000002b40420f00000000002200207f89b60332c0a813268782be20d14c67626b76aa4832e1b9726c57a01750bc83475221032edd70e88cbfcda8c91eb9b20ff6a2c569a52de908933b048bf6b8414d7667b7210386998d8c3ecc235c80eb4605ec24c5192d27ddef57d204227d3ac0c54547312c52ae000100400000ffffffffffff0020d22458cead349cb596ccc159d17f2809dcc22620268d1a300a6e152547f7235280007fffffffffff809eb27b82a5de32ca44c8d8e38e705c62f5f4d3b945dfb5f03973dae05fa43885389eb27b82a5de32ca44c8d8e38e705c62f5f4d3b945dfb5f03973dae05fa43885001600146663df19ca3fcc1c04447b18d2cd795c485f1941389eb27b82a5de32ca44c8d8e38e705c62f5f4d3b945dfb5f03973dae05fa4388500160014d5f0a47e22dd767bca0be8f6d109a81a8815ff33" val dataNegotiating = hex"0100240000000703af0ed6052cf28d670665549bc86f4b721c9fdb309d40c58f5811f63966e005d0000928544434bbbda1da0790cf138ef4b3881f5cec34b933ab77ffd57a7e12992bf780000001000000000000044c0000000008f0d1800000000000002710000000000000000000900064ff1600140cbd801be794f9854b38981ee859e3a000ad104c0000186b0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000229a82039dc0e0b1d25905e44fdf6f8e89755a5e219685840d0bc1d28d3308f9628a358500000000000003e8ffffffffffffffff0000000000004e2000000000000003e80090001e0234ea57c6a0d7308e0479811f0315df88650da7a8af626fb6ceb9a6b3e1bf068e032f5bf3637d4efa39b50a7bad5e3f6d32663a1cc207a166155f00f8b9a9f621cc026b8899cafac94bcfee408aecfec60e86a30082b0ea587d8a7ab6b2b309fc66110210996c2725e4129dad191f6c6d9ba8c35ab58df4d340051d7025d366423aa15703bf59f021a7431277a31a53b2101bd3ff5730adefeae596020e58c9099728b7f000000003229a820000000000000000000000000009c4000000002faf0800000000000bebc2002424d4fd09fbcbde0363fda5d43c8bc68cea396aa1edd3d48d118ec27bb30fd1d5000000002b40420f0000000000220020552fd9e112e447f57c95b896d384461ee713c8108894ced2ea1272e0d354aab74752210234ea57c6a0d7308e0479811f0315df88650da7a8af626fb6ceb9a6b3e1bf068e2103d45fea036aa6817a71387c3976790beeb4705739d4cf0271007043854dde877552aefd01bc0200000000010124d4fd09fbcbde0363fda5d43c8bc68cea396aa1edd3d48d118ec27bb30fd1d50000000000c089a180044a010000000000002200207ba66732d8b8e8863cbdcad193c4602b54df24f9af202a977e3a6315e85072704a01000000000000220020f25aee697436b14ebdc0bdab0b3a0c339c98e49cd6a8b84fbfb84c7c5557aad1400d030000000000220020a659aeaecad3be965ed5a498adac881967d2d3ed2a773019da1b26337c7d0d1372270c000000000022002095c2df1035ebb714a728a166d88332e1569b3da5c035037df1bc07e227b7e1ec040047304402205837856dc4bc8f4a679015460580c38a29899986f6cca09afe3525097dcef36702201b2abd6fdbfa890e247cbe6a096bb01f3d47901a552f7f5e5c6ecb6c80a07d1701483045022100abfa35999608ea0c993418f7d432c7f9710b993f4eb45e17fbb95e10c6899e190220542593d102382a92a11eac65bef87a75742ee4447abebb38fc47c4d27d74f9a2014752210234ea57c6a0d7308e0479811f0315df88650da7a8af626fb6ceb9a6b3e1bf068e2103d45fea036aa6817a71387c3976790beeb4705739d4cf0271007043854dde877552ae68075c20000000000000000000000000000009c4000000000bebc200000000002faf080054b02aad4844030f2e1c3c61f95b34df8d14c0fdbddbe5d56090667016ca8979033d0000a1e29b94b3517a04106dc7bb74f4f091a2ee419d889ecf8434bcfdf127000000000000000000000000000000000000000000000000000000000000ff03228da9a93e02211af77afa576b94f57d747099099f5352298d8b3c4dbc7215c62424d4fd09fbcbde0363fda5d43c8bc68cea396aa1edd3d48d118ec27bb30fd1d5000000002b40420f0000000000220020552fd9e112e447f57c95b896d384461ee713c8108894ced2ea1272e0d354aab74752210234ea57c6a0d7308e0479811f0315df88650da7a8af626fb6ceb9a6b3e1bf068e2103d45fea036aa6817a71387c3976790beeb4705739d4cf0271007043854dde877552ae00000024d4fd09fbcbde0363fda5d43c8bc68cea396aa1edd3d48d118ec27bb30fd1d53824d4fd09fbcbde0363fda5d43c8bc68cea396aa1edd3d48d118ec27bb30fd1d5001600140cbd801be794f9854b38981ee859e3a000ad104c3824d4fd09fbcbde0363fda5d43c8bc68cea396aa1edd3d48d118ec27bb30fd1d50016001458043e6e40996eb9d3c77752a81398115ec43d5900010002db71020000000124d4fd09fbcbde0363fda5d43c8bc68cea396aa1edd3d48d118ec27bb30fd1d50000000000ffffffff02400d03000000000016001458043e6e40996eb9d3c77752a81398115ec43d59ac1a0c00000000001600140cbd801be794f9854b38981ee859e3a000ad104c000000006824d4fd09fbcbde0363fda5d43c8bc68cea396aa1edd3d48d118ec27bb30fd1d50000000000001a54fa574848f29f143c52f2717510e2a8831afaf7752217ce3452c7e88d24eb14905191e04229fc6433aef69bc33f9f2f6eb3c841fee628f7c583b9efe5a149aa47db71020000000124d4fd09fbcbde0363fda5d43c8bc68cea396aa1edd3d48d118ec27bb30fd1d50000000000ffffffff02400d03000000000016001458043e6e40996eb9d3c77752a81398115ec43d59f81d0c00000000001600140cbd801be794f9854b38981ee859e3a000ad104c000000006824d4fd09fbcbde0363fda5d43c8bc68cea396aa1edd3d48d118ec27bb30fd1d50000000000001708fc4039310f093081478d723e70b6bb1f17aa925472ccef2f79057aafce602726039f88ed9a0eb0841c61c39a5c224516288a81a53256693588f5af97e9e76c88fffd014e0200000000010124d4fd09fbcbde0363fda5d43c8bc68cea396aa1edd3d48d118ec27bb30fd1d50000000000ffffffff02400d03000000000016001458043e6e40996eb9d3c77752a81398115ec43d5942210c00000000001600140cbd801be794f9854b38981ee859e3a000ad104c0400483045022100ced76c39d6c63a52374b17103eba46ac6d21b5f5e427d48ffcd5e505a26477b90220588f30b94c0938632bcee8cfe9bc185325b2edde88c85fb4d226eda215abf26b01473044022042741816de3767e7b54fc1cdf94b6f0072203daf76c01ba5abb120801965413b02205237d5f3978b2332aa14ce65501fa784f51ea4e97030d44536f52f188f768074014752210234ea57c6a0d7308e0479811f0315df88650da7a8af626fb6ceb9a6b3e1bf068e2103d45fea036aa6817a71387c3976790beeb4705739d4cf0271007043854dde877552ae00000000" val dataClosingLocal = hex"0100250000000103af0ed6052cf28d670665549bc86f4b721c9fdb309d40c58f5811f63966e005d0000948d8efaf118cae9f142433a624b41a9ef7e09327fa45083ebd7694e1a61c429980000001000000000000044c0000000008f0d1800000000000002710000000000000000000900064ff16001401396601573e7aef81f91a89fc4b4b56feb7a35e0000186b0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028a82039dc0e0b1d25905e44fdf6f8e89755a5e219685840d0bc1d28d3308f9628a358500000000000003e8ffffffffffffffff0000000000004e2000000000000003e80090001e03174f3de90105ae02d88ccc1a7ed4bf0d116f27ef6010f1ec308273c1010ae3dc02fc17b2289973a29fd374ee24671d5d9643465a11bd725bac1d640b56493bd8f702b5460ae3379bc8a92d2aa2488f3e55a73d8909695e677beddd61a94d3655490f0357a1a37c3ae33b2a94bca0b6ae541036c22feeca86860c7c5501153ccfffd585028fb43c64d53c5d891bb0af3b7ed41acf3ebb0de59599b3e7836a8401645cb6e000000003028a82000000000000000007000500fd05aa0a007eacf337b3a80941f2defd530cf824f13cd263ba2ca194e7170072ce28e8000000000000000400000000017d784077c3e8caa53f1a775a5e89b1a54488aff835593d5e2b7355179136bbdd10a86c00061b1000020b7604aeb7cb080b12de62f75a292bed3134b4a3de764bd032fb049e2c2a1d3942cc11b9b12619d42cda3c7eb63da952644a3f355bdf772d77f1fc2a0b36bf116cdacfcda3b77974536cc3f3d0f8209dba69408073cbe0f039eba220fcf3b0b96d5875bb71acdc999fd9feeab68a0b63629efe0dc91e92dcf93b3c49285c981746a68ead7a96a9c1ce21284a2796b0051e6b7cf36a264d545063c054454b87cc3f9ddad5350382585de18cdc4e65e02484695f541b8fc082c87ea4a56aabc84fd1b7c1cd40e3517ae811f9ff921fba672e0191c88a2681ef8ea1300eeb6c1d8fccdb5ab05bf80b2a5c3ed5c018752cc841305edae02149389bc5e58ea5a59a1c59755c7ab5f35e3740c9f6218d227370363a7e386b214f5b2e771ea8b94a2a5e640d8a715d57756665f4a659f4ef6488f9ceab5e22d523ee52da368701d799fcb3459a31e6fb03de91ffd9b608656b172945015da3e5000f7f6c3dc0b4e102ba5f101bab5c2ceab8021d071bf89cf9d65d2439fe9a9dea4291eccb43a431904313655391ace4b82bf5da6270eb5bc12a60a69e7cf96b75a699db5a374713558eff7101bb2d8471e0c4ad0e202fd10aa46098bd5565c1d410e695fdd799c866090f1a7aa002305388acb68c8d82d588c1a66df5fb12653686bc4cf487a3484c0c23578a428de3df57539ed11227f2648bc36261c7f3f4f13e18d238dc856b8dd8f07de9fb73663d3a0026a03d9ee9f807e2a03c9546d2537a1f30a1f06767622d8bacdf4ab3b0f245a7b4f482baa60080fce3e7e15d2e086c670d6ec11d907e3da593977c8c25d620ed40cf82dd503c25f1a5f3e8a5ddb65ae7117600794844252e1448d17849028bd5df960a5fddf56e48cf082cfbc5c29666bca6af335c06f8240912a311e6c07946eeea9ef57e46b3e48b95c82cbee3830bf2b55d5e0223b9480fe072729a8af4c6c8c2f86038cb8a2e02405ce5f834c87b241fcb9963f008c273c64bc1f7289cc3a0c5eea7ea1a6dc7bc6228a97978a2ddd7dc49303c5beb15b36c8044f656716cad0a62d1e8c381db46f007be7f8096f72d3a8f08d338d9f2bbc43c0244215df229824a9ad34b655d840b38c5061462d54358be1c184b51d3a805beeea78047f544b15cc333d591f3d8cb60cbdd78e58ed47d21739762957ed6365fea14d7ba8368371fe4333be4f5ae289ff444c9f377a072a3a4173bd2680c6d6074743908d9c4f09aa30d064c7866a7a34303fce53deba6a597a24c211d209815bbff97736ba9fc79e390b36b2343d2590c8fd6db3e54206580eb7a53b9de09a42cfaa2cffb00ea90dbd07f1d357e69ca96fbba4efefc4e07b1a1a174a9a8a5568c0ec9a9487add3890a20391eebd69a56c4dd1a7c7112766b05d29fcfdd0f60d8c3f7287ec070201b4d0200e3ebbf47a97c230a7d2f05b25bec59cfd125f6cc15529f13fc624ebfd387327119434b66e61a8446e9fd9e14f4e0a42cee83f4600b195a06f4f0e55d67239c55256db69c3eb5218f9d214e0d9ca0992dee76630b55a96136a251a84711096475028e326782112f2afd64c3795f438ea623754cb0ea5e6a0d4e1ded7ee633f1eb8bf71b791646c8953e54a07242a178c02baf8fc68e7c1d3e6982b265802f50353b7f1eb0d8f33c9aed1b18432ecd04d10f951473a0e7d7e3e88a3cfca46ad1b11c5abca59bab0c8e880519753b9f4a9ab4f7a756d58a389dc3bdb25940a71a03899125b08efd7ec85b3cf0c1577014a81bf63b2144617cf259383a41af2d50a7ebb7d45a8968e3e3edfb1f4a45368ba380d172f82e641eb16949e192a3c2a37117df8e22fb7a4e7ed425f9951b392bc59184db81899ed2270844446a29aaed5cb3839c392d51636a24b737a3100417a849104c08606b4644a785080b67a92dfe888cd987100fd05aa0a007eacf337b3a80941f2defd530cf824f13cd263ba2ca194e7170072ce28e800000000000000070000000001312d0077c3e8caa53f1a775a5e89b1a54488aff835593d5e2b7355179136bbdd10a86c00061b1100030159105c3e04b59668b1516a793628be01d018e0de5972a7e6094a8b29761bd07a1654dc17ab21c8f940806cd4ccfd904db9594a8170f310b1e2d95e0e8b0baab7f8484c2c66a91b7f4274ec9e5cc3651ef2ee3a0177281548905a3c7d03c4ddf2bf8b736a940d69f2a5e6beaea33d92ce189a96803654a52b0d3da0cbdbbe0725e64dc4a6633f33318de0f6ca50b9f2a79ac68fdfe3a6f6c01a5215dc3bdfb56a780dc17968c5afd3270c50d4f7e1f540364e184d460e8b8479719788023ed029ad1439d0a0c85570b7a3f50ff70a82bd9ff9c04d6d8154046a30a3606ce25c2fbda28c863109cfaa95b7fe4f96622c715422ed1a8e99ce5bdecadb7c39798822115215e3914409d5de1e2c95a6c375c530b27fd0263d02167eb28628b945280a668f88c607bd74e3aac0ac704dfda9e796a76e6a856aee502b41c6f3932b6a89425484d580b6abc232cb12530b38b5c20cbbdcb0357210c3ad09a3ad7a56353dbbd6087f7cbccbae1f656ad06d370e4ec5a7906c9841a1f36f24ba6eab5c70b5d66bc8aecb60d9feb4576ef33b23456332483f01fcd0e01477789448ddc20fa207f496db56203fdaf53f6d64d97153d8e8c8c89c821f526f4b376e929d7598cf368b826313eb0ac5e435097b3f4acef26cfb30e63ab70622ff1ed04f9a1c02074bdb2d302d932cffbba4f833ab95912272ec87d8c05a8c5f1b2b101fb78a75cf9d0ab6e751163f27018f08c2fae76c7a6a417cf5cae2cdbd867115d9c1f162e83c3fc4f52202d3471212c3ae6eb39f882aa322609958dfbc8ca3f3a2eb051ef1b43d452b54c2352e8c9d184cbbd46ea936161067893164a72a34f6e2fd63c94353e524c9db699d15cef86f970bcf6a92dc367152f9740e84b2c292dbb338e4f21e6a47171b5a5cec0f4026906b528ad2c115866fb9e807faa200b600637abd774148f7637789946a82ec5c8e35692470c0c0f12a6a39a0c5dddf73635f2dbbb82d9ea56d8313a25cfd879ee024ee5144817b1f96945f34632cf0a5a3dd3ebcb8b42bb6c4b1c3d2a7fc6f817c97ec6282a3981a8d9e3d7070c178f7df847fcec8013b0a0d07a4f8c13c829209172022e0d724caf5a01219575f1d5a26f50f53d72ef8b596ae2263d2c2eeb822166178d56eba9ee9a9c60adb4fe3a7be89044d34288c7bd59cbf6e88e01f971b687200fccdc68d5a21f8430a8e5654a17f05773b2254eb301a5624c4aadbd3db8641cfe866ff72424a891f5e0487a48c204870c932ed9895427ce9a3d0a183fc40b7bbea3617b321f35cbba2c2180908e9bea2e07e1e5d8d5de9846994b78a313b8828eca935f4bdf9ca861326cca20776c6a4df35eeee257899467973941e6e8c567054480a7d8077e6e61ab480562ad53ad8127874a7fa4f747ccb2601cfa6e8c43e89f678dd38e4df80adef7bf07149edd32bf0e9775f3478870da6af26709a5bebbac77018050a07f1a8ffe4539c2df9de1dfe18c9bf0aa640178b0912bd9631acebdc2f2f993039b6cfa414d5cfcd0c363a178443e954db312efcd4463ee7cfe0d8a1eabe74d47692653f996cdd9b93c9fad41c5b16aa91a7bd5b267578a537e45d2af048ee0ce09ea41c72020d61509e5e91575022e7d5956b8e680f229909642366d5a16a17f021f41ca3d13df75ac3d3c8c772c2ba042680ba81466f8d05c07e19b1cde5a4d27ba6b820a63fffc5a42234e18109f128cb1e3524d621e38855b5c11cfbe7edf25dc3cd470308971b655b3381f946531d89ed23ad24f6a3cacd022fb9e5eb1d5a188a5d0936d0dfe3c7c424dba5f8892b2adda87a171d73bb5c5b8f809812689794ee3a5a7dc7d80f9c84bdad2fb7f89b2a45dc25836a42c8757eaddabcab7f82e1e51502cdcd3c4745009c55fd70b1c8f1a748e71e2b96b312f71f21cb00fd05aa0a007eacf337b3a80941f2defd530cf824f13cd263ba2ca194e7170072ce28e80000000000000006000000000010c87c77c3e8caa53f1a775a5e89b1a54488aff835593d5e2b7355179136bbdd10a86c00061b100002a9a1e8cbe48ae54ff2f32eb81ac70966e623abd77532a8cef6c3dab174da1e2879020c2238504e525d2d3fae9adb39044e8e6d0c394ae9e6ff1f01ae21e354d0bd1a5970e77015dbb6a635157b6465c32aee891c26ff8942ccfd24b612e4df241c55fc34dc1a5a613d431b813e14d0ad78023314f93c38f2bba6a6ea6e642d59a547f97b306ae0d072944c62cdec15933ffd85dafd9cabf278d9b8121db56915075baa049ac0d47df8a32b6c54a9935fbc1284fe8af288d3dd72870c8faf77e34a20970bf44b47bda06f2b8bfc931252456760ba1fa58669a3ec443737b429095db43f5bdf8e5d7f2d2f9c7318cfe012213ad35d54751539605337143de28756a146779a41308dbf94be4c9290422cb79ba768c340bc91012488afc3b388fbc253bdb9a35b1f4e39307c89f9ec3bb58e5da660013a741c1ab6c0cb22a3c94db0bf6d207599a527f18831530179880ef00950886378abcb99d2d1502b874669fb8f0a596ce3909e314057d7d1f668ca80e23c46f86127a71a729021623038d23cba281ed4967ea654470d4fdb31b297def0d22f5897f58d28af0cd86287fa51722af2682fe259987f56a9fe74af94138bb520ed12bd86453cc44f31f00e337647997b56c8bf40e3e9233e42b4c4ffe2ccc438417c754e04c95a2e7f357eb238020a0b235b8757a40996b6dab0e09e526f891f1773153151d99f3f65e62f0db6d4d94fb18293ea2f13e8c900d575cc0800969ef1e6903e6958c02dac84a8e863bcb8226bd3c6bab1038b628661333449d801b8b739bb08e09daf59c969691306e9e09c68508c5a558708a9b138fb841906a1967ea6290198be18ea3941a72a95b1b55e38403bda57d391cfdb86db844a0d9b4762a550cb1d7010de80fd6507d1e2dc7830ccd49784f8e80a3c87d9301339572b0347db9336bb7b1ede0fd1e187ca94aba942fe2b5c230f7dd1d3d0376aa882136b112883999227e2be17e9d681fb813acb70807b47e99bac127ca67c2d9619049783f8a9089d3fea4275585533683308ab94f3f02f577fb840ffae279813439fcb30eb5874329c48160768c2ca6b5d6368775989b96a056f22f7dddfbcd1b22a7fb74bb2d1b36f3e94914b82709a9351e1be88364a17a36b2a92ef61bb0520fefb802393b9e9effd6d54741ab9c6dbf28911bc45b334d9c2a6d76d94ecc2a19a3115d0f2b5e5ddb1f29fc9db0b3a21651afc2f93d321189621d8b59ab07e8d4e348f4bdbdb25b91d19b313850afddf92300c7fcebd9b266792745a24a505c56a3f98428ec70b65b0396a46836cabe49024d382eb1c8227e2df4da21385960f3d3801fb63d73ae69a4fcb6aca7018e874e8bf44f73c5e845ce81b2c643862c0344e3f4e50f4e6cb51b53a6c90ea545bc897dd73e2d2b3250711ed2a666413ae85b22e848735e8a6306e3b80f3677c8f40f85bf2f457f7764343288530a9c58b160de657df482af5eb0f291a50071d207cf46969643c113a6b15354b0b590885fbf4a7136939463ef66e013cb794ac6ab0fa887352817827ffc420bd8d1ee0b6a04d6819eadc1d96517c2edd8fe028101cd9842e407a44a8eb6bbda3fc5c54997fa43aaf340ed8ab6f75e3b588dd906ebd9deba889711b3895bd7df494f042e68cd78d7e75c237bd22b90e49e5571e169487508dfea22bfe2c83f21ec1e91f7d9331e5ac4ba6c52c1183afb1e083f3d0c42af6cf41e82e9151b5717b934ba6e4f52757d27a7c8139c523f977cb9c7f29e4a19cf41a1288c60a9ee10f58189351a51925422276e2da9ce3a4ca6944b767601e686745e88b7902e0e110dd66189dec74e3abbc76a4045d5051a6b76c91b2b20fc2ab1ca7d5d63f25d2c83f5d8ab31034e3ca42c4af1ed6017f5b10c2f44a52d78bf858aa7c148b6f07156ee365cd463d3c00fd05aa0a007eacf337b3a80941f2defd530cf824f13cd263ba2ca194e7170072ce28e800000000000000030000000001c9c38077c3e8caa53f1a775a5e89b1a54488aff835593d5e2b7355179136bbdd10a86c00061b1000031a12d4e5b7253515c5822879f6f1738224e451910cacebbb545aa637e2a0f631a151e02f206b6397055534bd6a0b7c7990d269d153d3886fc7e51fd4e09c5357a96694911e9912135e3f9ccec1058be709a743ee44f07feebb0fc6a3078bec155a1b9f67afaac6914debcc890fd86150d790f8de1b7168d4501064dacfd16c19f61a8c13c7658df92d6e5ad79b1b251a96db66bfc498e8e4114f98b9b36bc41663c9d2d15a280fdae479c14e52e148b0f86abbe4f9ef78570e193585b5aa30e53d54352eba5ad54d238f0d756b54aca9889fb21c57b6c639a6713a4f655d5dde92391185a9d8c929bca42c3bc9ba5f65b059dcbab02e89cf2e95fe1b1fb291aa1c2aeb8b57ab24f92414fc296a37b683a1d47155acb5210ffb6a170642e0f1cf7a4704861099b23c0294f367f28bf6fb6f839ba3e958ba6954ef630f90d014b687e63decc26c395601a885583ee0f1a86de5d60069664e2b93a7e936579e934a084b3e34850a1c26dc5fe7a8479278e6000f5025552b0d43ec186cd01a4d6ae748ba9289d39046c3568982aac9593a3496d3eec561b538a9b0d9ed91a4560f504174bb70725fc1c9bc354afe11d1e8aab3389774d619fdff96ea096c8283c2555e9d3169c8dd543bc74eb9f3dd4f17105563922aa18243f7135429b7a71368b44975e07443fb6f5eae089b88dc2d729d87e303104b8a7172902cdb8500ce9cd2086f7a7f6ce683942caae21ed05596c46d8f87f98eadb034c472a3f6b9d7a83d41fa70b44beb4288973cee486adc191a9aad1d1b7cebac6225aec67eed51c347fa5c145e183454b2a514a5044808eea8a9b28b24e39b115e2faa75f04d370285684857129e14e6726bb23aa0ff9323e9687578446868705f3137289c49357ff4acb134f6f3f7dc7efe6b6a332cd2fbbef0579493c4368b70815ff13abc1e3cb08c3931d8b7c99bb8b5e89fccda77a6d51fee07754332500517b75bd26bc66c81cf9f0e8a34e01c700b86590fa1cc7682a6d20c10d325d735dabc43db87ae2700e4966d8be90e408aca19ba1327ab209d4a574095e37285880c31cd631aabafa6b6c31b6db80b989ec57141ab35a5d7e32445f153da3832b223831bcaa8d1cedf6cf9d8e2dc121fd1b8a744481690be8668d6185113853ad1e86fbfe5a1b216208d3300532b0c80bc751d805260f1e6b014fe8f0b904a54560baa1b9f9d81479024b9d722fa577d9708eeb5b84c5005766f2e2c622689e1d750dc16ddd74450fedec590cb49014d4cba6dff6d2aa2c15b71067c8c02128e587f6a09556ee2e8e6b1b6bb8380ea6e79f43fb6e427fa66f0b616b84261b18f07d3607eaf4b932f38fd7267c742c503862458a1d1f01b239e94f39bcce1864564ce2f021fd43673964e77d3616bf8405b4c770996fa48d312458b29be5c05a6941ce5b3b2ff4ff32ad784ea47a664fbc2bec22fb6faecf928539773cd5c0972d9e6a10762a66190c3b5cc9b77d3546ec02d355aeec68ca9af34b2f8c44071b6d9b608f17e24ec3ac185cd9fab9b9bfdfb7873e748796af1b87820707752798534334b0e79bf108d60ef61a2c3cbdffc663b54f2ef407ae43749d31681e3da13ab3beb1f4ac2053cc7286bd7a3192ca412d1692ddcb1fc33131c19bc312d72b1616b91110fc15a8f33b2429eb0fd07bb034405bb879e54cf2f4331c2fbafc69cca8c2ff5a762c7f139edbe123735e63490a17f309ec895077731e5f6d6a53e513f1a3c15eaf72db4605d65eaf5cdc830155f5b9bf4e96a3644dd0ae9ab1f09778fdcd763668507d1c49663dc4a64def5f24577d2b1b34113f6a2a92999bcaf649536e431b8c2c30491cb54fe84b7e087c7fdd1e9b92dfaa31651138e7602602a45d331528ebd79b450ea237b195e80a04a2261a00fdd918cd0b0116f9d00fd05aa0a007eacf337b3a80941f2defd530cf824f13cd263ba2ca194e7170072ce28e800000000000000050000000001c9c38077c3e8caa53f1a775a5e89b1a54488aff835593d5e2b7355179136bbdd10a86c00061b100003d4b11a6510316810f0248ea0530220e3255171fd5fce2eee5d0bff33d694904b77c108bd2c322ebc2c3231e1f78618ab9ba83f81fcbbc7278f4d0cf17edb4342ccf40ba133606f6597f474b0dde594a6f8af078aadcfc940d5fcccd32793a1266190f06e55aec9b95b9f2e552ee8d5e4a662a7cdddb20599b14e3105699f2618395ca9d80ca232f5a96e48e27a09b24b3c28b38b42bf63464dbfc0d233c635d1379784581f5ff2f2fa2c6dff4cf8c12454745c695ea394d0fc477f4907e82e636e347306ee70730f61aa75ddbb10cf023b28a5e1f7dfed48470bf4b3180e343ea7f578a0d8f33505aa36b3875226b668376db40b3171f5a2eef326b0a416fd27cd7c7936e71cc9822421d9e317db5fa31de68f4be412666c3ef4c699acbadf94d2bfd1f32ad1f962da04965d20d783047a415f5f6a59117422dc26c5f05a5ef0180081e9b7771277ae8520647e833c2dc80149baea35700c35aadce8c4c81ef6e3fc3ec55e3fe3b9f846710fd648668ca3ba05f6b7cf5eddc9b5a7e73f2ac4d1f53864765cf70f55128ec53692bf26656da9468ea93b7030063a2021ad57cf3ab1df019c21118f6f9cec64def026910242fc4809d2224210460d63d02f2d6475b371b97907cc3c1e72f56ce8285cc08fd4e37f439f39b63667c045f4b5dc5f982cdc8b32fa0392ce38dccfa6a79f5bcaccd2bdaae666404947fd8b6d8ad7e16ae1307d7b24cc15d712814d1311bdf2155ee28da446ddd2bd0e782c225a8a379073314ec486aa2a9dc54c4edc2e2dea278f39ee23b0d7c2f5df7a20ffe5d77541d1c42a94a17e977763f15dd889c939104b691553ec8c99d5c87a9513553a7384e3a45fac0193b77fd8b7a2c5bf291a6954c767addeca4c91a04946688491c56818bb9de51d2e2dfc2c0b2e8f3e929ba04d9b3f457935f8c797dd770cd6558b6238ba0706a500bd9aaa17565a8a8b8abb41e4717f312d9b449de7dcd5317e1f6ba71b428f5e96857fc9acaef6298d4e994746a45534715af1326c79836f0f3a7ae3aaa41c90f172ec8544d13086237420207fddbae7d349a2871a62f465a6c57bb54e623c36067f41f33282a8548e5047d3d2da4c83483811ee3559bd7479216631281aeee1152f1fb876beb57b51c9cbf002ce9e6c81129a119120e24789958bb1de20448f01692ea4b955099b808af3c4dc7ad6652a9eff075f91fd3bbf54ec7d450c8000005894542b810974b36f6a66125e047dc491aa376b70aef9fd65379c0668937a86e0c12772520a151df018c031b931b2e0c0a25419f10080fa9010ddee60b4861692ed00bef79ab5cae1a4d5baf62552a111845c3969538bed014baac2169b2c6e847b3123a7aff9761736ba9e2f5f4d0f94852c921599615f91bbbdeb230ddf834305c9c70490307c300952b8e61e5255b31cd09f2ca7cdbb4c4e76798a78c0a8709d86c7dfd5dc008af596308a36e0d28c4ba60d68151858e740ccbcc068b0acb3fb81bea92e4e979ac39057ccb19c8603658efc62f6222621cf956b377b7ff0fea770908f04600c2720b03371a62ef941159fcc015248ba326f31d1bc82e4d94c186d4f6c39e1f55600221a2cdf85b560b78dc5fb3e74069021e9062e2e7c6173716ca70dc843cf02070253d31ddb9c4b569df4fe243b78a8300788104b575d641108510bafea96a25bbea6b8f6474fa1886de9d525a4fbdb480afc4ed96482ff2aa8e64142c285b11c87ffef811b5026b3a2587a91aff83c6825c4d0634ccc7aab85e795c11491f3e0883568c23e67efcd4c26a5db3ca0b5c3bbded3c6e355738319c1a087d8da87db4da52d4c5214d272cd1631b2843cbd6b015e52eb51a8bb759d529ae6ab7b397aa8963f2074c9278fa8499de47dc9152bb8726de26f5bbf24e9ca7e329353ca2da6363b4e00002710000000000598cd44000000002faf0800240a007eacf337b3a80941f2defd530cf824f13cd263ba2ca194e7170072ce28e8000000002b40420f0000000000220020e2eb1e4df160f9e11d4d06a6075034b47e9d3e1c3d21d0feab64905d2e6ab17b47522103174f3de90105ae02d88ccc1a7ed4bf0d116f27ef6010f1ec308273c1010ae3dc2103548b338f50bdae124711cadef7a82ce832bff61826f13b031677793abb8c674c52aefd0205020000000001010a007eacf337b3a80941f2defd530cf824f13cd263ba2ca194e7170072ce28e80000000000a1c4a78006204e0000000000002200204c81bcdcc2c4f01d3c045348a155c9249ddba4d48c16ccf33c1d8b6e34614180a8610000000000002200204c81bcdcc2c4f01d3c045348a155c9249ddba4d48c16ccf33c1d8b6e3461418030750000000000002200204c81bcdcc2c4f01d3c045348a155c9249ddba4d48c16ccf33c1d8b6e3461418030750000000000002200204c81bcdcc2c4f01d3c045348a155c9249ddba4d48c16ccf33c1d8b6e34614180a437010000000000220020680a82e78074810847ca530cd74fabdbd2e34beaf0fdd2bc832ddfcd2669876c00350c0000000000160014e1fdef3169db3728018a906129e3913dd841ab0f04004730440220639ddfeb4cfd418c28418208226f5f6be762b65bb242968695ac1574d1fae8e702207bd3b3f60f12f171a37e50b7126c709a4cb87e417efdfe520707962d393bd28c01473044022058407ee97260aa8020eea7036f348ec4959fbd8a820e8628244705138803e00e02207d53e7fec4e01bbc04a0495e8c31210c0c6c2542e38d6c9ae677b78bd568cedb0147522103174f3de90105ae02d88ccc1a7ed4bf0d116f27ef6010f1ec308273c1010ae3dc2103548b338f50bdae124711cadef7a82ce832bff61826f13b031677793abb8c674c52ae340169200004000324efa7874aa335cd976b8209145d670a6dba17471f6a4f47dacaa432dd972d801c000000002b204e0000000000002200204c81bcdcc2c4f01d3c045348a155c9249ddba4d48c16ccf33c1d8b6e346141808576a9144a2fe35d15fdacd3b3cba332b5879b6acfb2e79f8763ac67210375099d4e25580f8d2c59718d7319e9d26c7119f9476ca3a623fb638843d3c8617c820120876475527c210375f5c7f3e5f1da49febb149cb9dc97098402628f84b79b586d5d516c17e6327852ae67a914950b69c651378982bec084b296e6dd23a33c41b588ac68685e0200000001efa7874aa335cd976b8209145d670a6dba17471f6a4f47dacaa432dd972d801c000000000000000000013a34000000000000220020680a82e78074810847ca530cd74fabdbd2e34beaf0fdd2bc832ddfcd2669876c111b06004093d252d2f22cecee6c2b604a1190120db574f0ba33b49ac826229b95071230bd7a4baa7a1704813804ba9b7d0e2aef3932a7d7d096862c1636736ad3296a46f5401f096356d49cb9c0d1dad9a01530aa892aa75cdcb626f42ef09b734f39d0a2650d6274377598b29f3f3eae1281a8b61d5cb9853b478cc973b8035af5d60c26a0000324efa7874aa335cd976b8209145d670a6dba17471f6a4f47dacaa432dd972d801c010000002ba8610000000000002200204c81bcdcc2c4f01d3c045348a155c9249ddba4d48c16ccf33c1d8b6e346141808576a9144a2fe35d15fdacd3b3cba332b5879b6acfb2e79f8763ac67210375099d4e25580f8d2c59718d7319e9d26c7119f9476ca3a623fb638843d3c8617c820120876475527c210375f5c7f3e5f1da49febb149cb9dc97098402628f84b79b586d5d516c17e6327852ae67a914950b69c651378982bec084b296e6dd23a33c41b588ac68685e0200000001efa7874aa335cd976b8209145d670a6dba17471f6a4f47dacaa432dd972d801c01000000000000000001c247000000000000220020680a82e78074810847ca530cd74fabdbd2e34beaf0fdd2bc832ddfcd2669876c101b060040774ca3fbbee6dc29db89dbb2bdb977afdf31727548aa6060e9e23a79090bf658474a5aa2de53dae36371ec535e13e4291c9fbd1942e7cc812ff4ca4c9d84483c4088605547607e6c8b1b24a671ed340700ad396a8bf613fa9e4646c0b11c2aeff708e4448ba70fe48903e3034ace605d8651091fcd6f80fddb57d2e2b09da6765d000324efa7874aa335cd976b8209145d670a6dba17471f6a4f47dacaa432dd972d801c020000002b30750000000000002200204c81bcdcc2c4f01d3c045348a155c9249ddba4d48c16ccf33c1d8b6e346141808576a9144a2fe35d15fdacd3b3cba332b5879b6acfb2e79f8763ac67210375099d4e25580f8d2c59718d7319e9d26c7119f9476ca3a623fb638843d3c8617c820120876475527c210375f5c7f3e5f1da49febb149cb9dc97098402628f84b79b586d5d516c17e6327852ae67a914950b69c651378982bec084b296e6dd23a33c41b588ac68685e0200000001efa7874aa335cd976b8209145d670a6dba17471f6a4f47dacaa432dd972d801c020000000000000000014a5b000000000000220020680a82e78074810847ca530cd74fabdbd2e34beaf0fdd2bc832ddfcd2669876c101b0600404ec5ef779e7b0db022d9da0986bee62eeb0372337f3974e0bfa8ecbddec7a3ed47930ce5ca6796d3cde21dbf9e0678f4d0af5d84889c24e2b960786d141b900a402c736579e487f2ceedb15546a438818e9a13d3b9f9232d4ff418855f9112795e2bce08fb52f8737268b616158eeb06e36abdc83942396fb407d3e603ed1edd7b000324efa7874aa335cd976b8209145d670a6dba17471f6a4f47dacaa432dd972d801c030000002b30750000000000002200204c81bcdcc2c4f01d3c045348a155c9249ddba4d48c16ccf33c1d8b6e346141808576a9144a2fe35d15fdacd3b3cba332b5879b6acfb2e79f8763ac67210375099d4e25580f8d2c59718d7319e9d26c7119f9476ca3a623fb638843d3c8617c820120876475527c210375f5c7f3e5f1da49febb149cb9dc97098402628f84b79b586d5d516c17e6327852ae67a914950b69c651378982bec084b296e6dd23a33c41b588ac68685e0200000001efa7874aa335cd976b8209145d670a6dba17471f6a4f47dacaa432dd972d801c030000000000000000014a5b000000000000220020680a82e78074810847ca530cd74fabdbd2e34beaf0fdd2bc832ddfcd2669876c101b060040ff0a3853c07d426ac93a8b772017a41f324558851ec69bcd65ed1cd81490e0f11c3c01574fe196df6311cf21fbb78abd7d40659479ea080c7ccb3c5fd53027df404f63e06d948b7890c8a3fb1ae568e88de8cd4ef3364c092bcdeb006c40558b082a5fc572f9f02f5d2a0870101ff7d900da184fb19b5cd410ba0779bc55533c4a00000000000000070005fffd05aa0a007eacf337b3a80941f2defd530cf824f13cd263ba2ca194e7170072ce28e800000000000000030000000001c9c38077c3e8caa53f1a775a5e89b1a54488aff835593d5e2b7355179136bbdd10a86c00061b1000031a12d4e5b7253515c5822879f6f1738224e451910cacebbb545aa637e2a0f631a151e02f206b6397055534bd6a0b7c7990d269d153d3886fc7e51fd4e09c5357a96694911e9912135e3f9ccec1058be709a743ee44f07feebb0fc6a3078bec155a1b9f67afaac6914debcc890fd86150d790f8de1b7168d4501064dacfd16c19f61a8c13c7658df92d6e5ad79b1b251a96db66bfc498e8e4114f98b9b36bc41663c9d2d15a280fdae479c14e52e148b0f86abbe4f9ef78570e193585b5aa30e53d54352eba5ad54d238f0d756b54aca9889fb21c57b6c639a6713a4f655d5dde92391185a9d8c929bca42c3bc9ba5f65b059dcbab02e89cf2e95fe1b1fb291aa1c2aeb8b57ab24f92414fc296a37b683a1d47155acb5210ffb6a170642e0f1cf7a4704861099b23c0294f367f28bf6fb6f839ba3e958ba6954ef630f90d014b687e63decc26c395601a885583ee0f1a86de5d60069664e2b93a7e936579e934a084b3e34850a1c26dc5fe7a8479278e6000f5025552b0d43ec186cd01a4d6ae748ba9289d39046c3568982aac9593a3496d3eec561b538a9b0d9ed91a4560f504174bb70725fc1c9bc354afe11d1e8aab3389774d619fdff96ea096c8283c2555e9d3169c8dd543bc74eb9f3dd4f17105563922aa18243f7135429b7a71368b44975e07443fb6f5eae089b88dc2d729d87e303104b8a7172902cdb8500ce9cd2086f7a7f6ce683942caae21ed05596c46d8f87f98eadb034c472a3f6b9d7a83d41fa70b44beb4288973cee486adc191a9aad1d1b7cebac6225aec67eed51c347fa5c145e183454b2a514a5044808eea8a9b28b24e39b115e2faa75f04d370285684857129e14e6726bb23aa0ff9323e9687578446868705f3137289c49357ff4acb134f6f3f7dc7efe6b6a332cd2fbbef0579493c4368b70815ff13abc1e3cb08c3931d8b7c99bb8b5e89fccda77a6d51fee07754332500517b75bd26bc66c81cf9f0e8a34e01c700b86590fa1cc7682a6d20c10d325d735dabc43db87ae2700e4966d8be90e408aca19ba1327ab209d4a574095e37285880c31cd631aabafa6b6c31b6db80b989ec57141ab35a5d7e32445f153da3832b223831bcaa8d1cedf6cf9d8e2dc121fd1b8a744481690be8668d6185113853ad1e86fbfe5a1b216208d3300532b0c80bc751d805260f1e6b014fe8f0b904a54560baa1b9f9d81479024b9d722fa577d9708eeb5b84c5005766f2e2c622689e1d750dc16ddd74450fedec590cb49014d4cba6dff6d2aa2c15b71067c8c02128e587f6a09556ee2e8e6b1b6bb8380ea6e79f43fb6e427fa66f0b616b84261b18f07d3607eaf4b932f38fd7267c742c503862458a1d1f01b239e94f39bcce1864564ce2f021fd43673964e77d3616bf8405b4c770996fa48d312458b29be5c05a6941ce5b3b2ff4ff32ad784ea47a664fbc2bec22fb6faecf928539773cd5c0972d9e6a10762a66190c3b5cc9b77d3546ec02d355aeec68ca9af34b2f8c44071b6d9b608f17e24ec3ac185cd9fab9b9bfdfb7873e748796af1b87820707752798534334b0e79bf108d60ef61a2c3cbdffc663b54f2ef407ae43749d31681e3da13ab3beb1f4ac2053cc7286bd7a3192ca412d1692ddcb1fc33131c19bc312d72b1616b91110fc15a8f33b2429eb0fd07bb034405bb879e54cf2f4331c2fbafc69cca8c2ff5a762c7f139edbe123735e63490a17f309ec895077731e5f6d6a53e513f1a3c15eaf72db4605d65eaf5cdc830155f5b9bf4e96a3644dd0ae9ab1f09778fdcd763668507d1c49663dc4a64def5f24577d2b1b34113f6a2a92999bcaf649536e431b8c2c30491cb54fe84b7e087c7fdd1e9b92dfaa31651138e7602602a45d331528ebd79b450ea237b195e80a04a2261a00fdd918cd0b0116f9dfffd05aa0a007eacf337b3a80941f2defd530cf824f13cd263ba2ca194e7170072ce28e800000000000000050000000001c9c38077c3e8caa53f1a775a5e89b1a54488aff835593d5e2b7355179136bbdd10a86c00061b100003d4b11a6510316810f0248ea0530220e3255171fd5fce2eee5d0bff33d694904b77c108bd2c322ebc2c3231e1f78618ab9ba83f81fcbbc7278f4d0cf17edb4342ccf40ba133606f6597f474b0dde594a6f8af078aadcfc940d5fcccd32793a1266190f06e55aec9b95b9f2e552ee8d5e4a662a7cdddb20599b14e3105699f2618395ca9d80ca232f5a96e48e27a09b24b3c28b38b42bf63464dbfc0d233c635d1379784581f5ff2f2fa2c6dff4cf8c12454745c695ea394d0fc477f4907e82e636e347306ee70730f61aa75ddbb10cf023b28a5e1f7dfed48470bf4b3180e343ea7f578a0d8f33505aa36b3875226b668376db40b3171f5a2eef326b0a416fd27cd7c7936e71cc9822421d9e317db5fa31de68f4be412666c3ef4c699acbadf94d2bfd1f32ad1f962da04965d20d783047a415f5f6a59117422dc26c5f05a5ef0180081e9b7771277ae8520647e833c2dc80149baea35700c35aadce8c4c81ef6e3fc3ec55e3fe3b9f846710fd648668ca3ba05f6b7cf5eddc9b5a7e73f2ac4d1f53864765cf70f55128ec53692bf26656da9468ea93b7030063a2021ad57cf3ab1df019c21118f6f9cec64def026910242fc4809d2224210460d63d02f2d6475b371b97907cc3c1e72f56ce8285cc08fd4e37f439f39b63667c045f4b5dc5f982cdc8b32fa0392ce38dccfa6a79f5bcaccd2bdaae666404947fd8b6d8ad7e16ae1307d7b24cc15d712814d1311bdf2155ee28da446ddd2bd0e782c225a8a379073314ec486aa2a9dc54c4edc2e2dea278f39ee23b0d7c2f5df7a20ffe5d77541d1c42a94a17e977763f15dd889c939104b691553ec8c99d5c87a9513553a7384e3a45fac0193b77fd8b7a2c5bf291a6954c767addeca4c91a04946688491c56818bb9de51d2e2dfc2c0b2e8f3e929ba04d9b3f457935f8c797dd770cd6558b6238ba0706a500bd9aaa17565a8a8b8abb41e4717f312d9b449de7dcd5317e1f6ba71b428f5e96857fc9acaef6298d4e994746a45534715af1326c79836f0f3a7ae3aaa41c90f172ec8544d13086237420207fddbae7d349a2871a62f465a6c57bb54e623c36067f41f33282a8548e5047d3d2da4c83483811ee3559bd7479216631281aeee1152f1fb876beb57b51c9cbf002ce9e6c81129a119120e24789958bb1de20448f01692ea4b955099b808af3c4dc7ad6652a9eff075f91fd3bbf54ec7d450c8000005894542b810974b36f6a66125e047dc491aa376b70aef9fd65379c0668937a86e0c12772520a151df018c031b931b2e0c0a25419f10080fa9010ddee60b4861692ed00bef79ab5cae1a4d5baf62552a111845c3969538bed014baac2169b2c6e847b3123a7aff9761736ba9e2f5f4d0f94852c921599615f91bbbdeb230ddf834305c9c70490307c300952b8e61e5255b31cd09f2ca7cdbb4c4e76798a78c0a8709d86c7dfd5dc008af596308a36e0d28c4ba60d68151858e740ccbcc068b0acb3fb81bea92e4e979ac39057ccb19c8603658efc62f6222621cf956b377b7ff0fea770908f04600c2720b03371a62ef941159fcc015248ba326f31d1bc82e4d94c186d4f6c39e1f55600221a2cdf85b560b78dc5fb3e74069021e9062e2e7c6173716ca70dc843cf02070253d31ddb9c4b569df4fe243b78a8300788104b575d641108510bafea96a25bbea6b8f6474fa1886de9d525a4fbdb480afc4ed96482ff2aa8e64142c285b11c87ffef811b5026b3a2587a91aff83c6825c4d0634ccc7aab85e795c11491f3e0883568c23e67efcd4c26a5db3ca0b5c3bbded3c6e355738319c1a087d8da87db4da52d4c5214d272cd1631b2843cbd6b015e52eb51a8bb759d529ae6ab7b397aa8963f2074c9278fa8499de47dc9152bb8726de26f5bbf24e9ca7e329353ca2da6363b4efffd05aa0a007eacf337b3a80941f2defd530cf824f13cd263ba2ca194e7170072ce28e8000000000000000400000000017d784077c3e8caa53f1a775a5e89b1a54488aff835593d5e2b7355179136bbdd10a86c00061b1000020b7604aeb7cb080b12de62f75a292bed3134b4a3de764bd032fb049e2c2a1d3942cc11b9b12619d42cda3c7eb63da952644a3f355bdf772d77f1fc2a0b36bf116cdacfcda3b77974536cc3f3d0f8209dba69408073cbe0f039eba220fcf3b0b96d5875bb71acdc999fd9feeab68a0b63629efe0dc91e92dcf93b3c49285c981746a68ead7a96a9c1ce21284a2796b0051e6b7cf36a264d545063c054454b87cc3f9ddad5350382585de18cdc4e65e02484695f541b8fc082c87ea4a56aabc84fd1b7c1cd40e3517ae811f9ff921fba672e0191c88a2681ef8ea1300eeb6c1d8fccdb5ab05bf80b2a5c3ed5c018752cc841305edae02149389bc5e58ea5a59a1c59755c7ab5f35e3740c9f6218d227370363a7e386b214f5b2e771ea8b94a2a5e640d8a715d57756665f4a659f4ef6488f9ceab5e22d523ee52da368701d799fcb3459a31e6fb03de91ffd9b608656b172945015da3e5000f7f6c3dc0b4e102ba5f101bab5c2ceab8021d071bf89cf9d65d2439fe9a9dea4291eccb43a431904313655391ace4b82bf5da6270eb5bc12a60a69e7cf96b75a699db5a374713558eff7101bb2d8471e0c4ad0e202fd10aa46098bd5565c1d410e695fdd799c866090f1a7aa002305388acb68c8d82d588c1a66df5fb12653686bc4cf487a3484c0c23578a428de3df57539ed11227f2648bc36261c7f3f4f13e18d238dc856b8dd8f07de9fb73663d3a0026a03d9ee9f807e2a03c9546d2537a1f30a1f06767622d8bacdf4ab3b0f245a7b4f482baa60080fce3e7e15d2e086c670d6ec11d907e3da593977c8c25d620ed40cf82dd503c25f1a5f3e8a5ddb65ae7117600794844252e1448d17849028bd5df960a5fddf56e48cf082cfbc5c29666bca6af335c06f8240912a311e6c07946eeea9ef57e46b3e48b95c82cbee3830bf2b55d5e0223b9480fe072729a8af4c6c8c2f86038cb8a2e02405ce5f834c87b241fcb9963f008c273c64bc1f7289cc3a0c5eea7ea1a6dc7bc6228a97978a2ddd7dc49303c5beb15b36c8044f656716cad0a62d1e8c381db46f007be7f8096f72d3a8f08d338d9f2bbc43c0244215df229824a9ad34b655d840b38c5061462d54358be1c184b51d3a805beeea78047f544b15cc333d591f3d8cb60cbdd78e58ed47d21739762957ed6365fea14d7ba8368371fe4333be4f5ae289ff444c9f377a072a3a4173bd2680c6d6074743908d9c4f09aa30d064c7866a7a34303fce53deba6a597a24c211d209815bbff97736ba9fc79e390b36b2343d2590c8fd6db3e54206580eb7a53b9de09a42cfaa2cffb00ea90dbd07f1d357e69ca96fbba4efefc4e07b1a1a174a9a8a5568c0ec9a9487add3890a20391eebd69a56c4dd1a7c7112766b05d29fcfdd0f60d8c3f7287ec070201b4d0200e3ebbf47a97c230a7d2f05b25bec59cfd125f6cc15529f13fc624ebfd387327119434b66e61a8446e9fd9e14f4e0a42cee83f4600b195a06f4f0e55d67239c55256db69c3eb5218f9d214e0d9ca0992dee76630b55a96136a251a84711096475028e326782112f2afd64c3795f438ea623754cb0ea5e6a0d4e1ded7ee633f1eb8bf71b791646c8953e54a07242a178c02baf8fc68e7c1d3e6982b265802f50353b7f1eb0d8f33c9aed1b18432ecd04d10f951473a0e7d7e3e88a3cfca46ad1b11c5abca59bab0c8e880519753b9f4a9ab4f7a756d58a389dc3bdb25940a71a03899125b08efd7ec85b3cf0c1577014a81bf63b2144617cf259383a41af2d50a7ebb7d45a8968e3e3edfb1f4a45368ba380d172f82e641eb16949e192a3c2a37117df8e22fb7a4e7ed425f9951b392bc59184db81899ed2270844446a29aaed5cb3839c392d51636a24b737a3100417a849104c08606b4644a785080b67a92dfe888cd9871fffd05aa0a007eacf337b3a80941f2defd530cf824f13cd263ba2ca194e7170072ce28e80000000000000006000000000010c87c77c3e8caa53f1a775a5e89b1a54488aff835593d5e2b7355179136bbdd10a86c00061b100002a9a1e8cbe48ae54ff2f32eb81ac70966e623abd77532a8cef6c3dab174da1e2879020c2238504e525d2d3fae9adb39044e8e6d0c394ae9e6ff1f01ae21e354d0bd1a5970e77015dbb6a635157b6465c32aee891c26ff8942ccfd24b612e4df241c55fc34dc1a5a613d431b813e14d0ad78023314f93c38f2bba6a6ea6e642d59a547f97b306ae0d072944c62cdec15933ffd85dafd9cabf278d9b8121db56915075baa049ac0d47df8a32b6c54a9935fbc1284fe8af288d3dd72870c8faf77e34a20970bf44b47bda06f2b8bfc931252456760ba1fa58669a3ec443737b429095db43f5bdf8e5d7f2d2f9c7318cfe012213ad35d54751539605337143de28756a146779a41308dbf94be4c9290422cb79ba768c340bc91012488afc3b388fbc253bdb9a35b1f4e39307c89f9ec3bb58e5da660013a741c1ab6c0cb22a3c94db0bf6d207599a527f18831530179880ef00950886378abcb99d2d1502b874669fb8f0a596ce3909e314057d7d1f668ca80e23c46f86127a71a729021623038d23cba281ed4967ea654470d4fdb31b297def0d22f5897f58d28af0cd86287fa51722af2682fe259987f56a9fe74af94138bb520ed12bd86453cc44f31f00e337647997b56c8bf40e3e9233e42b4c4ffe2ccc438417c754e04c95a2e7f357eb238020a0b235b8757a40996b6dab0e09e526f891f1773153151d99f3f65e62f0db6d4d94fb18293ea2f13e8c900d575cc0800969ef1e6903e6958c02dac84a8e863bcb8226bd3c6bab1038b628661333449d801b8b739bb08e09daf59c969691306e9e09c68508c5a558708a9b138fb841906a1967ea6290198be18ea3941a72a95b1b55e38403bda57d391cfdb86db844a0d9b4762a550cb1d7010de80fd6507d1e2dc7830ccd49784f8e80a3c87d9301339572b0347db9336bb7b1ede0fd1e187ca94aba942fe2b5c230f7dd1d3d0376aa882136b112883999227e2be17e9d681fb813acb70807b47e99bac127ca67c2d9619049783f8a9089d3fea4275585533683308ab94f3f02f577fb840ffae279813439fcb30eb5874329c48160768c2ca6b5d6368775989b96a056f22f7dddfbcd1b22a7fb74bb2d1b36f3e94914b82709a9351e1be88364a17a36b2a92ef61bb0520fefb802393b9e9effd6d54741ab9c6dbf28911bc45b334d9c2a6d76d94ecc2a19a3115d0f2b5e5ddb1f29fc9db0b3a21651afc2f93d321189621d8b59ab07e8d4e348f4bdbdb25b91d19b313850afddf92300c7fcebd9b266792745a24a505c56a3f98428ec70b65b0396a46836cabe49024d382eb1c8227e2df4da21385960f3d3801fb63d73ae69a4fcb6aca7018e874e8bf44f73c5e845ce81b2c643862c0344e3f4e50f4e6cb51b53a6c90ea545bc897dd73e2d2b3250711ed2a666413ae85b22e848735e8a6306e3b80f3677c8f40f85bf2f457f7764343288530a9c58b160de657df482af5eb0f291a50071d207cf46969643c113a6b15354b0b590885fbf4a7136939463ef66e013cb794ac6ab0fa887352817827ffc420bd8d1ee0b6a04d6819eadc1d96517c2edd8fe028101cd9842e407a44a8eb6bbda3fc5c54997fa43aaf340ed8ab6f75e3b588dd906ebd9deba889711b3895bd7df494f042e68cd78d7e75c237bd22b90e49e5571e169487508dfea22bfe2c83f21ec1e91f7d9331e5ac4ba6c52c1183afb1e083f3d0c42af6cf41e82e9151b5717b934ba6e4f52757d27a7c8139c523f977cb9c7f29e4a19cf41a1288c60a9ee10f58189351a51925422276e2da9ce3a4ca6944b767601e686745e88b7902e0e110dd66189dec74e3abbc76a4045d5051a6b76c91b2b20fc2ab1ca7d5d63f25d2c83f5d8ab31034e3ca42c4af1ed6017f5b10c2f44a52d78bf858aa7c148b6f07156ee365cd463d3cfffd05aa0a007eacf337b3a80941f2defd530cf824f13cd263ba2ca194e7170072ce28e800000000000000070000000001312d0077c3e8caa53f1a775a5e89b1a54488aff835593d5e2b7355179136bbdd10a86c00061b1100030159105c3e04b59668b1516a793628be01d018e0de5972a7e6094a8b29761bd07a1654dc17ab21c8f940806cd4ccfd904db9594a8170f310b1e2d95e0e8b0baab7f8484c2c66a91b7f4274ec9e5cc3651ef2ee3a0177281548905a3c7d03c4ddf2bf8b736a940d69f2a5e6beaea33d92ce189a96803654a52b0d3da0cbdbbe0725e64dc4a6633f33318de0f6ca50b9f2a79ac68fdfe3a6f6c01a5215dc3bdfb56a780dc17968c5afd3270c50d4f7e1f540364e184d460e8b8479719788023ed029ad1439d0a0c85570b7a3f50ff70a82bd9ff9c04d6d8154046a30a3606ce25c2fbda28c863109cfaa95b7fe4f96622c715422ed1a8e99ce5bdecadb7c39798822115215e3914409d5de1e2c95a6c375c530b27fd0263d02167eb28628b945280a668f88c607bd74e3aac0ac704dfda9e796a76e6a856aee502b41c6f3932b6a89425484d580b6abc232cb12530b38b5c20cbbdcb0357210c3ad09a3ad7a56353dbbd6087f7cbccbae1f656ad06d370e4ec5a7906c9841a1f36f24ba6eab5c70b5d66bc8aecb60d9feb4576ef33b23456332483f01fcd0e01477789448ddc20fa207f496db56203fdaf53f6d64d97153d8e8c8c89c821f526f4b376e929d7598cf368b826313eb0ac5e435097b3f4acef26cfb30e63ab70622ff1ed04f9a1c02074bdb2d302d932cffbba4f833ab95912272ec87d8c05a8c5f1b2b101fb78a75cf9d0ab6e751163f27018f08c2fae76c7a6a417cf5cae2cdbd867115d9c1f162e83c3fc4f52202d3471212c3ae6eb39f882aa322609958dfbc8ca3f3a2eb051ef1b43d452b54c2352e8c9d184cbbd46ea936161067893164a72a34f6e2fd63c94353e524c9db699d15cef86f970bcf6a92dc367152f9740e84b2c292dbb338e4f21e6a47171b5a5cec0f4026906b528ad2c115866fb9e807faa200b600637abd774148f7637789946a82ec5c8e35692470c0c0f12a6a39a0c5dddf73635f2dbbb82d9ea56d8313a25cfd879ee024ee5144817b1f96945f34632cf0a5a3dd3ebcb8b42bb6c4b1c3d2a7fc6f817c97ec6282a3981a8d9e3d7070c178f7df847fcec8013b0a0d07a4f8c13c829209172022e0d724caf5a01219575f1d5a26f50f53d72ef8b596ae2263d2c2eeb822166178d56eba9ee9a9c60adb4fe3a7be89044d34288c7bd59cbf6e88e01f971b687200fccdc68d5a21f8430a8e5654a17f05773b2254eb301a5624c4aadbd3db8641cfe866ff72424a891f5e0487a48c204870c932ed9895427ce9a3d0a183fc40b7bbea3617b321f35cbba2c2180908e9bea2e07e1e5d8d5de9846994b78a313b8828eca935f4bdf9ca861326cca20776c6a4df35eeee257899467973941e6e8c567054480a7d8077e6e61ab480562ad53ad8127874a7fa4f747ccb2601cfa6e8c43e89f678dd38e4df80adef7bf07149edd32bf0e9775f3478870da6af26709a5bebbac77018050a07f1a8ffe4539c2df9de1dfe18c9bf0aa640178b0912bd9631acebdc2f2f993039b6cfa414d5cfcd0c363a178443e954db312efcd4463ee7cfe0d8a1eabe74d47692653f996cdd9b93c9fad41c5b16aa91a7bd5b267578a537e45d2af048ee0ce09ea41c72020d61509e5e91575022e7d5956b8e680f229909642366d5a16a17f021f41ca3d13df75ac3d3c8c772c2ba042680ba81466f8d05c07e19b1cde5a4d27ba6b820a63fffc5a42234e18109f128cb1e3524d621e38855b5c11cfbe7edf25dc3cd470308971b655b3381f946531d89ed23ad24f6a3cacd022fb9e5eb1d5a188a5d0936d0dfe3c7c424dba5f8892b2adda87a171d73bb5c5b8f809812689794ee3a5a7dc7d80f9c84bdad2fb7f89b2a45dc25836a42c8757eaddabcab7f82e1e51502cdcd3c4745009c55fd70b1c8f1a748e71e2b96b312f71f21cb00002710000000002faf0800000000000598cd446da1a38c05425e396afcb5fbb37ea2a9db15c56121e2fae11ec9f06da63917610371ece811f4d34713b42d65c38a775487c71c193a52df6ac46d6a013164681dd200000000000000000000000000000000000000080000000000000000000500000000000000050003d6ec06b2431d4e1f9c36a610af90d6c40000000000000006000317def351ac5745148ba3275aacb2b68f000000000000000700035d913d0e286346e1a50fe900f618b18600000000000000030003c35487d4d1e24e38bb4f923885d19b44000000000000000400030c7e6ecdbccf41baab2f7d95ca9e5e9bff03d32570a2783f1792d20fbe141f337d5dded9509c875e13288fe140400f36560e240a007eacf337b3a80941f2defd530cf824f13cd263ba2ca194e7170072ce28e8000000002b40420f0000000000220020e2eb1e4df160f9e11d4d06a6075034b47e9d3e1c3d21d0feab64905d2e6ab17b47522103174f3de90105ae02d88ccc1a7ed4bf0d116f27ef6010f1ec308273c1010ae3dc2103548b338f50bdae124711cadef7a82ce832bff61826f13b031677793abb8c674c52ae0003003e0000fffffffffffc008030b0e83d8813791baf507a3c85c55d81cf80a50fd9f08504260743bb8033212800fc0003ffffffffffe80101460f774080d0e1bad18203f9af025451bfb4b8de611116890dd1fa45dd0f8e9802000007ffffffffffc80104c31735de0c70dc61744d1123646e49d871b662ae090c568a3ba7666fe370ce0c0003ffffffffffe40a007eacf337b3a80941f2defd530cf824f13cd263ba2ca194e7170072ce28e8000000000000061a8000000000fffd0205020000000001010a007eacf337b3a80941f2defd530cf824f13cd263ba2ca194e7170072ce28e80000000000a1c4a78006204e0000000000002200204c81bcdcc2c4f01d3c045348a155c9249ddba4d48c16ccf33c1d8b6e34614180a8610000000000002200204c81bcdcc2c4f01d3c045348a155c9249ddba4d48c16ccf33c1d8b6e3461418030750000000000002200204c81bcdcc2c4f01d3c045348a155c9249ddba4d48c16ccf33c1d8b6e3461418030750000000000002200204c81bcdcc2c4f01d3c045348a155c9249ddba4d48c16ccf33c1d8b6e34614180a437010000000000220020680a82e78074810847ca530cd74fabdbd2e34beaf0fdd2bc832ddfcd2669876c00350c0000000000160014e1fdef3169db3728018a906129e3913dd841ab0f04004730440220639ddfeb4cfd418c28418208226f5f6be762b65bb242968695ac1574d1fae8e702207bd3b3f60f12f171a37e50b7126c709a4cb87e417efdfe520707962d393bd28c01473044022058407ee97260aa8020eea7036f348ec4959fbd8a820e8628244705138803e00e02207d53e7fec4e01bbc04a0495e8c31210c0c6c2542e38d6c9ae677b78bd568cedb0147522103174f3de90105ae02d88ccc1a7ed4bf0d116f27ef6010f1ec308273c1010ae3dc2103548b338f50bdae124711cadef7a82ce832bff61826f13b031677793abb8c674c52ae34016920ffed02000000000101efa7874aa335cd976b8209145d670a6dba17471f6a4f47dacaa432dd972d801c04000000009000000001c62401000000000016001401396601573e7aef81f91a89fc4b4b56feb7a35e03483045022100c787b74c895285a11e04a680a50cef980d74a1ea53998bc2abaa2f7e13b6131b02204e0a8216f2efe89880feac989f9b0cfbf6aea1a61444d453d5547060aa65cc5901004d632103d6a391d54b9683da5c4c1ab1720739757422861b7ca98da226118061b40c412e67029000b2752102f2b77c73154588dfa6301b6c69062c0a713467996542a836f7a2ce6a239ba68868ac0000000000000004fd017a02000000000101efa7874aa335cd976b8209145d670a6dba17471f6a4f47dacaa432dd972d801c000000000000000000013a34000000000000220020680a82e78074810847ca530cd74fabdbd2e34beaf0fdd2bc832ddfcd2669876c050047304402201f096356d49cb9c0d1dad9a01530aa892aa75cdcb626f42ef09b734f39d0a26502200d6274377598b29f3f3eae1281a8b61d5cb9853b478cc973b8035af5d60c26a00148304502210093d252d2f22cecee6c2b604a1190120db574f0ba33b49ac826229b95071230bd02207a4baa7a1704813804ba9b7d0e2aef3932a7d7d096862c1636736ad3296a46f501008576a9144a2fe35d15fdacd3b3cba332b5879b6acfb2e79f8763ac67210375099d4e25580f8d2c59718d7319e9d26c7119f9476ca3a623fb638843d3c8617c820120876475527c210375f5c7f3e5f1da49febb149cb9dc97098402628f84b79b586d5d516c17e6327852ae67a914950b69c651378982bec084b296e6dd23a33c41b588ac6868111b0600fd017a02000000000101efa7874aa335cd976b8209145d670a6dba17471f6a4f47dacaa432dd972d801c01000000000000000001c247000000000000220020680a82e78074810847ca530cd74fabdbd2e34beaf0fdd2bc832ddfcd2669876c050048304502210088605547607e6c8b1b24a671ed340700ad396a8bf613fa9e4646c0b11c2aeff7022008e4448ba70fe48903e3034ace605d8651091fcd6f80fddb57d2e2b09da6765d014730440220774ca3fbbee6dc29db89dbb2bdb977afdf31727548aa6060e9e23a79090bf6580220474a5aa2de53dae36371ec535e13e4291c9fbd1942e7cc812ff4ca4c9d84483c01008576a9144a2fe35d15fdacd3b3cba332b5879b6acfb2e79f8763ac67210375099d4e25580f8d2c59718d7319e9d26c7119f9476ca3a623fb638843d3c8617c820120876475527c210375f5c7f3e5f1da49febb149cb9dc97098402628f84b79b586d5d516c17e6327852ae67a914950b69c651378982bec084b296e6dd23a33c41b588ac6868101b0600fd017902000000000101efa7874aa335cd976b8209145d670a6dba17471f6a4f47dacaa432dd972d801c020000000000000000014a5b000000000000220020680a82e78074810847ca530cd74fabdbd2e34beaf0fdd2bc832ddfcd2669876c050047304402202c736579e487f2ceedb15546a438818e9a13d3b9f9232d4ff418855f9112795e02202bce08fb52f8737268b616158eeb06e36abdc83942396fb407d3e603ed1edd7b0147304402204ec5ef779e7b0db022d9da0986bee62eeb0372337f3974e0bfa8ecbddec7a3ed022047930ce5ca6796d3cde21dbf9e0678f4d0af5d84889c24e2b960786d141b900a01008576a9144a2fe35d15fdacd3b3cba332b5879b6acfb2e79f8763ac67210375099d4e25580f8d2c59718d7319e9d26c7119f9476ca3a623fb638843d3c8617c820120876475527c210375f5c7f3e5f1da49febb149cb9dc97098402628f84b79b586d5d516c17e6327852ae67a914950b69c651378982bec084b296e6dd23a33c41b588ac6868101b0600fd017a02000000000101efa7874aa335cd976b8209145d670a6dba17471f6a4f47dacaa432dd972d801c030000000000000000014a5b000000000000220020680a82e78074810847ca530cd74fabdbd2e34beaf0fdd2bc832ddfcd2669876c050047304402204f63e06d948b7890c8a3fb1ae568e88de8cd4ef3364c092bcdeb006c40558b0802202a5fc572f9f02f5d2a0870101ff7d900da184fb19b5cd410ba0779bc55533c4a01483045022100ff0a3853c07d426ac93a8b772017a41f324558851ec69bcd65ed1cd81490e0f102201c3c01574fe196df6311cf21fbb78abd7d40659479ea080c7ccb3c5fd53027df01008576a9144a2fe35d15fdacd3b3cba332b5879b6acfb2e79f8763ac67210375099d4e25580f8d2c59718d7319e9d26c7119f9476ca3a623fb638843d3c8617c820120876475527c210375f5c7f3e5f1da49febb149cb9dc97098402628f84b79b586d5d516c17e6327852ae67a914950b69c651378982bec084b296e6dd23a33c41b588ac6868101b06000004ec02000000000101ea542e3a509a29b8d2afac84f21bc8f4e100df901b35c9fc19a331c588683519000000000090000000015c2100000000000016001401396601573e7aef81f91a89fc4b4b56feb7a35e034730440220359f29d38879b19665015a2b85bd60e4e3949292f75d2294d5a545aa392dd1fd022036aa2b42bdedd9deca319eece3e8a5670fe89e78231e1025b9fc1079a931398d01004d632103d6a391d54b9683da5c4c1ab1720739757422861b7ca98da226118061b40c412e67029000b2752102f2b77c73154588dfa6301b6c69062c0a713467996542a836f7a2ce6a239ba68868ac00000000ed02000000000101374c80d9d5213e7bf0ea94c3a8085866a4d533590d89f68e829162d03d431a2600000000009000000001e43400000000000016001401396601573e7aef81f91a89fc4b4b56feb7a35e03483045022100d486e826ecfddcc474b719cb69e641efe97b4795b8ea4bb9729237788a3d35ed022051b097591bfc53dc855303672e17ad8488de9f2bcca670995060f331a7dfe55e01004d632103d6a391d54b9683da5c4c1ab1720739757422861b7ca98da226118061b40c412e67029000b2752102f2b77c73154588dfa6301b6c69062c0a713467996542a836f7a2ce6a239ba68868ac00000000ed02000000000101a436af3ff69624fd11b543c0b8d451190bcb7891a7259832cb64445571dc3003000000000090000000016c4800000000000016001401396601573e7aef81f91a89fc4b4b56feb7a35e03483045022100c203f2093d4b182ba5b78a471f806acf13c4d44f7191068abaf2b7a6742f427e02200fabe2a24e947f467a48fca7bba3ed68387ce46c32533366d99a52cefb0e3ad801004d632103d6a391d54b9683da5c4c1ab1720739757422861b7ca98da226118061b40c412e67029000b2752102f2b77c73154588dfa6301b6c69062c0a713467996542a836f7a2ce6a239ba68868ac00000000ec020000000001013798507505fc7de865bccaad655dc03b3899bba86e139dfbc543a2a2f9b4b842000000000090000000016c4800000000000016001401396601573e7aef81f91a89fc4b4b56feb7a35e034730440220724b0e5a340e80de26f3908ae510a34c93b5632dbd539c1a155856cad5375ac402203de9139fbaadd86a11168c612b75f974a6143e68c564de77c8b350f2978ff2f901004d632103d6a391d54b9683da5c4c1ab1720739757422861b7ca98da226118061b40c412e67029000b2752102f2b77c73154588dfa6301b6c69062c0a713467996542a836f7a2ce6a239ba68868ac0000000000000000000000" assert(JsonSerializers.serialization.write(ChannelCodecs.channelDataCodec.decode(dataNormal.bits).require.value)(JsonSerializers.formats).contains(""""type":"DATA_NORMAL"""")) - assert(JsonSerializers.serialization.write(ChannelCodecs.channelDataCodec.decode(dataWaitForFundingConfirmed.bits).require.value)(JsonSerializers.formats).contains(""""type":"DATA_WAIT_FOR_FUNDING_CONFIRMED"""")) assert(JsonSerializers.serialization.write(ChannelCodecs.channelDataCodec.decode(dataShutdown.bits).require.value)(JsonSerializers.formats).contains(""""type":"DATA_SHUTDOWN"""")) assert(JsonSerializers.serialization.write(ChannelCodecs.channelDataCodec.decode(dataNegotiating.bits).require.value)(JsonSerializers.formats).contains(""""type":"DATA_NEGOTIATING"""")) assert(JsonSerializers.serialization.write(ChannelCodecs.channelDataCodec.decode(dataClosingLocal.bits).require.value)(JsonSerializers.formats).contains(""""type":"DATA_CLOSING"""")) - } test("serialize timestamps") { diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/payment/PaymentPacketSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/payment/PaymentPacketSpec.scala index 1a3edce695..7ebe752b07 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/payment/PaymentPacketSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/payment/PaymentPacketSpec.scala @@ -28,12 +28,12 @@ import fr.acinq.eclair.crypto.Sphinx import fr.acinq.eclair.payment.IncomingPaymentPacket.{ChannelRelayPacket, FinalPacket, NodeRelayPacket, decrypt} import fr.acinq.eclair.payment.OutgoingPaymentPacket._ import fr.acinq.eclair.router.BaseRouterSpec.channelHopFromUpdate -import fr.acinq.eclair.router.Router.{ChannelHop, NodeHop} +import fr.acinq.eclair.router.Router.NodeHop import fr.acinq.eclair.transactions.Transactions.InputInfo import fr.acinq.eclair.wire.protocol.OnionPaymentPayloadTlv.{AmountToForward, OutgoingCltv, PaymentData} import fr.acinq.eclair.wire.protocol.PaymentOnion.{ChannelRelayTlvPayload, FinalTlvPayload} import fr.acinq.eclair.wire.protocol._ -import fr.acinq.eclair.{CltvExpiry, CltvExpiryDelta, Features, InvoiceFeature, MilliSatoshi, MilliSatoshiLong, ShortChannelId, TestConstants, TimestampSecondLong, nodeFee, randomBytes32, randomKey} +import fr.acinq.eclair.{CltvExpiry, CltvExpiryDelta, Features, InvoiceFeature, MilliSatoshi, MilliSatoshiLong, ShortChannelId, TestConstants, TimestampSecondLong, UInt64, nodeFee, randomBytes32, randomKey} import org.scalatest.BeforeAndAfterAll import org.scalatest.funsuite.AnyFunSuite import scodec.Attempt @@ -369,8 +369,8 @@ object PaymentPacketSpec { } def makeCommitments(channelId: ByteVector32, testAvailableBalanceForSend: MilliSatoshi = 50000000 msat, testAvailableBalanceForReceive: MilliSatoshi = 50000000 msat, testCapacity: Satoshi = 100000 sat, channelFeatures: ChannelFeatures = ChannelFeatures()): Commitments = { - val params = LocalParams(null, null, null, null, None, null, null, 0, isInitiator = true, null, None, null) - val remoteParams = RemoteParams(randomKey().publicKey, null, null, None, null, null, maxAcceptedHtlcs = 0, null, null, null, null, null, null, None) + val params = LocalParams(null, null, null, Long.MaxValue.msat, None, null, null, 0, isInitiator = true, null, None, null) + val remoteParams = RemoteParams(randomKey().publicKey, null, UInt64.MaxValue, None, null, null, maxAcceptedHtlcs = 0, null, null, null, null, null, null, None) val commitInput = InputInfo(OutPoint(randomBytes32(), 1), TxOut(testCapacity, Nil), Nil) val channelFlags = ChannelFlags.Private new Commitments(channelId, ChannelConfig.standard, channelFeatures, params, remoteParams, channelFlags, null, null, null, null, 0, 0, Map.empty, null, commitInput, null) { diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/payment/relay/ChannelRelayerSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/payment/relay/ChannelRelayerSpec.scala index b123d35c51..30d412700b 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/payment/relay/ChannelRelayerSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/payment/relay/ChannelRelayerSpec.scala @@ -195,7 +195,7 @@ class ChannelRelayerSpec extends ScalaTestWithActorTestKit(ConfigFactory.load("a fwd1.message.replyTo ! RES_ADD_FAILED(fwd2.message, HtlcValueTooHighInFlight(channelIds(realScid1), UInt64(1000000000L), 1516977616L msat), Some(u1.channelUpdate)) // the relayer should give up - expectFwdFail(register, r.add.channelId, CMD_FAIL_HTLC(r.add.id, Right(TemporaryNodeFailure), commit = true)) + expectFwdFail(register, r.add.channelId, CMD_FAIL_HTLC(r.add.id, Right(TemporaryChannelFailure(u1.channelUpdate)), commit = true)) } test("fail to relay when we have no channel_update for the next channel") { f => @@ -350,6 +350,8 @@ class ChannelRelayerSpec extends ScalaTestWithActorTestKit(ConfigFactory.load("a val testCases = Seq( TestCase(ExpiryTooSmall(channelId1, CltvExpiry(100), CltvExpiry(0), BlockHeight(0)), u.channelUpdate, ExpiryTooSoon(u.channelUpdate)), TestCase(ExpiryTooBig(channelId1, CltvExpiry(100), CltvExpiry(200), BlockHeight(0)), u.channelUpdate, ExpiryTooFar), + TestCase(TooManyAcceptedHtlcs(channelId1, 10), u.channelUpdate, TemporaryChannelFailure(u.channelUpdate)), + TestCase(HtlcValueTooHighInFlight(channelId1, UInt64(250_000_000), 300_000_000 msat), u.channelUpdate, TemporaryChannelFailure(u.channelUpdate)), TestCase(InsufficientFunds(channelId1, payload.amountToForward, 100 sat, 0 sat, 0 sat), u.channelUpdate, TemporaryChannelFailure(u.channelUpdate)), TestCase(FeerateTooDifferent(channelId1, FeeratePerKw(1000 sat), FeeratePerKw(300 sat)), u.channelUpdate, TemporaryChannelFailure(u.channelUpdate)), TestCase(ChannelUnavailable(channelId1), u_disabled.channelUpdate, ChannelDisabled(u_disabled.channelUpdate.messageFlags, u_disabled.channelUpdate.channelFlags, u_disabled.channelUpdate)) 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 0d82508f50..2e309a0cea 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 @@ -88,7 +88,7 @@ class ChannelCodecsSpec extends AnyFunSuite { assert(bin_old.startsWith(hex"000001")) // let's decode the old data (this will use the old codec that provides default values for new fields) val data_new = channelDataCodec.decode(bin_old.toBitVector).require.value - assert(data_new.asInstanceOf[DATA_WAIT_FOR_FUNDING_CONFIRMED].fundingTx == None) + assert(data_new.asInstanceOf[DATA_WAIT_FOR_FUNDING_CONFIRMED].fundingTx.isEmpty) assert(TimestampSecond.now().toLong - data_new.asInstanceOf[DATA_WAIT_FOR_FUNDING_CONFIRMED].waitingSince.toLong < 3600) // we just set this to current time // and re-encode it with the new codec val bin_new = ByteVector(channelDataCodec.encode(data_new).require.toByteVector.toArray) @@ -161,7 +161,7 @@ class ChannelCodecsSpec extends AnyFunSuite { test("backward compatibility with eclair <= v0.5.1") { // the following were encoded with eclair v0.5.1 val dataNormal = hex"0100220000000103af0ed6052cf28d670665549bc86f4b721c9fdb309d40c58f5811f63966e005d000094a9267a1f2b86e492dacf939afd1561a0e42ed248d1a09f711204c176fef1b0f80000001000000000000044c0000000008f0d1800000000000002710000000000000000000900064ff16001429acc00c77e6894e41e417ae712e557d7bba1c460000186b0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028a82039dc0e0b1d25905e44fdf6f8e89755a5e219685840d0bc1d28d3308f9628a358500000000000003e8ffffffffffffffff0000000000004e2000000000000003e80090001e0252a01d9d8b03db1a99b1a82223f7dd60ecffa69dbef47c06228fdea2fe0f021503c2a3cb942c336afbe484a00452f5b027378e2124c7ea452f05c26ab89591c18f03019eec506c69765552b397d706dd276f0718c82e0a49224fbaccfad75f81b2f502d3d560591f03da622f338b0988bbf0f612fafa4f1b22ed51398cf7a07c5f4192025d67e71808e128eb21c82881cef04a510067a50d0f61f2f455bcfb7e168ae7ad00000003028a820000000000000000010007fffd05aa5d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee000000000000000000000000000493e0f81fd474bea478df0202b311c69e85dc6215f629491dd15ad0929faae2535abb00061b10000370b2714d2734e6b8cde085794dd7b41c8a9b6c03c1edd8e3db168ee7fce39493596e882b18b5b1b79c16400c6762b9856075821be6be9fab8f469f56820d8f341554400a8da7f1f1a8501902581d43b9fa6e5c68015716f718a2190b87fce41bf1b509aa61806394a42489d63c457fe4c79e7480eced1315edd731887e57704fc9102f50cb7f0d242d755cfd5a2172dbaf7f01b124861cc6d1dc804796bbb84165c805f0c0f3fb9ec97b74c2a694de56a9cf8d79d1a679260ee1169d78214b34c8a654ba22e59ddcd32beff4713de33549f035b342660405b0159a7a508e5691ef4805689140e72b8a0ef2e61be74dea5d0b8f5589e0e373cac2e2e1cc39b2121c05cf4122ad0f8b9af6fbf1de2ea26376c2650ccd306c13a7b64acbf2a3feed128754abe44658009e642768ae3d84f5e0fa5f7f360c2a1c76d26985817ae77b71fb59014a5483ebba9271cafa5e5d8031c569adeceb8bae6444e98d2522b28f6682109fc7d31cdb83ebd45e5d81e7f046df42345b49f470dbef9ed87709301d2c6131215d33a30b8d18e63e54a2aff85dd57672f8198bca6a67ee147c7d0ae649e5661ab6bf78a662fef9a164f1e332b9f16e6fb3d5769ddcbc1d1c07338d3394b9245d17618c2474e86c064fca4df00ad3a93dc051fd8c3328cde2a987798b0f22a21c90426700abeb1e6f38dffb485b5477ec44c690fa80e317b32a982fd3082253bba8595783290dbffee4fc9296ffdf16a8bf3154971bb720e78674969e9db2e0fbab9e9e13f24bc8b3af5e2f00f262f0da56de443f70398ab68f747d35370fcd8e1c0e130f7269e08f862b5a67f2c129be254df2358762ce3a947eb27d66450af51540e7721b47c8a5a86098ea64dad381f14e07aabbbc470949a99c07612add3ab4c575fe2e520bbe511a1a674aea37a44535c13ee3380f8f39bd230fc1481cd31912af36c6751e23c6f383cd37a8b13fa7df9f0c7e460739f2c6226638ee14f14d36366211cbc6a1e16b4856bf302a540aa9d9e833b1d59c510473096384c8b450f2f3f1dab9e614af822949d5cc93d76bc4d1a52891bc85f1981ef83161195ab7d8181ee4fb163bc6c685a10e87c7f4b15ed7d05833c230a4a5b63841fc65b959f0ff010e697f47c583f9b7fa9b389c0eff6614e47d85b83c483136f182be4c151d272f5d938b912a95e47d333e5de6a409ad271679a778a7eb3f169c71525302fac5d4575e2645c09763c2ef165736a7a726ca605038e2781404328790ffaacef2b9c2bf90122042cd571287bc4e3973da65fbd4e3da9e40e4347ca6eb4ef1ffef4e5a34be80425cae3e81533f7f2953f95fca53a22057a39125f5c76350fba7fc6c036838fb951d0aa8702e7f44c6f8a9cbce3b64fa8ddc2bb8c8b35d1e29a21beda6fdd332b31a749321455277231fd9d70ea4aded95053b395f88fa6916d126e1626fc0f1be6cd2a9538d17c498b40927f12b3bb40fa3e272e82cd2242b670afefa387470f4e6e0a1236028954c9e90311f486617187956a23b90b356d71e219e6dd055c2120771003a6c12769aa3ceacb9642bc01022731ca7a413b68ee7d1d5444f75dfa51a68b74a01ac85f6ceaf5e56987b9d67d6de896f5aafd25c78c413a6d4b5b03d571167524cd231ba13bd9f80fd7413faf21e8170cef0d08b242c5c38a2b0158da56e358ba0692f670d4611c7a3624b234adc30c5b7198e0afc941f5d13eae3a94ddffa652c784c34c582e04e948da91a5ac3038a9df38fd4f1733779f4f122ca2d7ff9d03bac9def35d9ee3a183161f8f2808d472b2e64581209359cea58ca7757164c666029982223877e2b14d2d537afb012f1ffc12cd083c16dfc64213c56f3d4d22b603d3dfab1d21e239d6fc1f9f153ed61f1ac91c29c85c16f4aa2985f84052f5a08d32bdd00fd05aa5d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee00000000000000000000000002faf08011b29e60a38883a8d4434f17ca3d92161109f7ddd8799e64e86d6b8509babd1100061b100003b8c1771721551fa88af8fdde92909add6e5b8fa90a4b0484ee065ed3ed7c56e733a7fcd775d4ab92956c1328ffee9c195004c5dee5dd5b9d0f9034589e6769e72579d3d5837ad70785ec420b4a24c04d36668728c0d2534ff1feea9aac2410423fd79c7db9231ee7efd3d585646e378fe53d731d18f38d6356a970f5c3026edc849d49ff34e58dfb7548512461110088ac3aa800e10785029ba3b0e9ab7bde0f056939e4921792dba2f5c005135daf57e32cae06a9ccb1b4d321f3ba015e5b92def1ff1c200e56b3990d82570586bfae26e9398e17dc6c069f92d80e6dfedf6b2f24b1dc3cc9d63e684d861f40fdbf508d4ac34b7f10c57be2a9b0c5921f86869c29ada5394b8780d2488a4fca3cd98ddb0ff8ea4415a07caea436682835744e94d5cff6d3024a9525dbd697e499b7ef23062b18b225bfaa4c5bb07166f34ff7866ec8f0fbbc12f695c609692798364fa20bf7977e321deda3fe5510833494532fba94fc1f0dd14ec74f3e9fe8ee659634621b63d16d46a8958132c24bd82c516bdf9ae9515cebae42778e4de6be7047c31cf86c0df0306f7b6562e1f35be51e5e64cc6d9d4c010849e6ac7ddacaa4b7b6fb1d35aac815964090940e73a1193eece11c1c1d37e373ef58c5e2d690b6ed6338360af9906146da9db8329bd2786bbf92df10445ee093f0b1b2a640cc2daf003fa7141435ba1dd54f9cdbf5417fa7f539b255452852a85d2ce97ce5abed4980e7b409e283f97ccc9c01e104b55155f96ace6789f61c4661962d34fc5d7e6f5f5233180933b2fa7f7a5b074714645489f5221966160946b7bfbf0fe6733e6beb8af4457b9d36cde1200811009ec483a9d730ca980aa28f636942af5e89794a8edbc1b75d555ba134974374d0fe23d31c26566064eb9998d649bb2bf066bf710da50672f4e3ab4df843a0c8942bad0a071c237d4c1759eca37380919e36aec73284db202a32d3d1619f3e5b757b2df8b04bde567783dc8e465d996799782f1a1b8de9331681a35aa04edb427de87264c8ae9c397f29d3e8730db91256425a10b960a9de1a48d0d4186d617d2b69c87e2540f6570faff4ee1f6303d7d281434947abeaad83c86a4d25bef4de2bb3c6104aa0ceed7c8df039f4be6a42851a118adb1b8f98e02f6727b75d98541bab2ff24fb2f20342e86150c678941825409b62a844f44ca1ccdf0d9f7c2cf9b222fbed00bc92be0802fbfbbeefa71c8976cba8fc4aeb031480f434027b1cd593d08cbc14c2a360b736b06b5afb8da35f0be3818fff4275b8c830f5248a8b8edea1327454e1360bd90d4fa08e965f459b0b027e1180290cf762f813a31e8109f472d9657b03af737d1f7bd2e59441541a84ba818f1413c5cd1f8b9882e9188e0def9e44e2f4a7c710c893c7188ba86423f8ae86068d84e1832af548289e87c34d68b186df7e24ca5b051f8f5e4a44e2e7383ba2a09615b4147b34e86486731290ea67f3be24c13a9c5cc37f06555989b3f10c580a9cd2b416d0ee4210855c6833a25996761dfabb036f3893cff7db7e310baa8faa79f46e0ee43bf4dfd732eae7f44bad2e7c032b9c6d14947af6b0e37e5ec98372a622f716ffba0cde04b9d4508392dd154ddc34829412bfa604d4f00e4b10a553587343ef5c0944165e7ee1e34387b09c147ecba943cf36dbc4269efe50ec3a5a3075c43be9651d6db6acb9f657476952b78c990557f05935247a71077373ec436ec586def177448f8859ba096b7a838e5b4ce7a463f9082f705c26d99936eb1be584ea9b58a44b9b4faa07fd8247fa66cf4529d1b8cdb92ed7bd96bf0968db4376489c7d46f0f27d58ac884c29736502953723ef1ab41e19c7041d3e0e9091d7de2e3904d032de02292edb1225a672ab438d3c65f7921c06a9f181f8ffda4ac524d0e000fd05aa5d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee000000000000000200000000000f4240657c0bd97e795218aa623b27cf9a71764379c4762fcee8993aa0b1ab1e32194a00061b100002c0ec5d388a8c78491bbd870faa2c46e4282e11796123b69c2792e5806748ef068397f0212a33e3f79162ba4ea247ccec410db039dd323af48ac27bd0ba77ecb870c587477d4543d9a29c53fc02bc98d7cd0144c7abf80b999c22b42a28ae8d625478ca304001f9a49782ec970031e673c76e4e27357a321729d6df38d1d88dcbf764c69eda3baac9739bed637010f44638cfe1deecc56b76f6e02d1d0c3f104462b9ffa5f20de4cf092d86a5bb35d5f62b0fb1c983a2c06df17c9ffc809c83e4b4335f5903fab536fbd9719847bb063541ecbe05c12ef8d058b3547faca054e3d662250f1cc1f925dd71297abc25fe37ab33a086759fac76208a64552f84d2e4d84daccdc3aa2bbd2c2f922bf262596742dfe034529d1ead2975dd3d197ab0e2e1c75c8b8f160ca6077638022d4afbd107979949cf342cb399347f3990029f0db6d9ac0c569d61d42539371f9a7ff59e9c83ff97d15bf0eeb254ae58fb7b1f9d8710c546ac8a227930c66ac841bc4f475229e5cadd14ba5a01e6b2da99c55861a08e2100e62c4499d30003fe30ddaa347d7a27c2158d3787d58fe51ae57d797bbef7f900508d1580df3e5233f0887567fba1faa918c246d2ec5c3b7aa022cb8a652d00b4d719e312482f57655eee80a90cdc73151fd7ab9c5367793d60c6088fab98f0547d7f547e10db202a25e027a5cd0abc41bb0e3ef563c0a6d469a702b2a26f0e8b4fddb845a16a5f06b9dee33c3adb31430c94942c5023179d3e4441948a332069a1c3b69dca65f05a43452e42fd28a2f7e6344f98ab9a7e4eece3c1709be1f7bb620f8b6c45989a8bccad39a4bf40e8215183d1449196f1f9fc17de778b616856152e6e6145a1b7a3d7f226becaea5ebe34aa4bd06e60f0fed207bfd21f5663bfadd37dd722437bcd46a26fb4e19d062574a81bcd817eecbc1914a5878809128961acdd73113ae9c51070ff4494e16d81ccec777eeb513da82bf43d4884812b26546b4370dc315793271b069f60f4285f648cf122ed8b22b0c7a27e94ccd59a273eb774c109e19980e146850de95f82cdd8aa0e82022672024c917b281422d284df0ee0bdeb3d4ac56b4ca675ebdb835c17b6a822d79ae7310f4aa41d80ac61c5e45c1c0e1d64542622a31091a9f87c335e86d964dd85a951d7c9bf41c9f2b1a9bb8424d7d1b26413da8034182fa42d2b1cd1f8745482c49d8348d19c72cf5a02bd28e4cba82128af8bf5d9c1215c4f543ef4d185f100f8d803dfa29c300c072e44ad9542b82fb1380d55c15c9a4b4398876e2450b90b49990746f339abca8cc8a462b62329a128758ce0e46b5f998af1bb485a3044bd125424eb5c623afd2a11befe4ec544eafe275ed1ad82b940dad5e9a9710d48562e51b296ba81f2d70593685ba0e3f3b25089a187e61d5675dd481aa99620276cb0a841a3c4df201a929287b1127270c5d25d06fb286dae1a9a5a5cdb60003f0c30d2021074bf252e550685f7b51a087a77b0871e883104e55f898aa5bc4cf8538c293253a737556d7f220e15b90cf0eda7d5f2172372e3c50c12cc588f312da37191b5038e944825044b130bff281ecd47a4252a1411ab7a9305c2b37e9facd435e9c434de37641498f8e4bfa7b42966da29c84200aca87ea1c3b00db54906b340e524a7dc4a15403bb82bc24517cb91026096bdf18f5f7ae5640ed6de1f0c5d184813d6b9d244b32b58e9ff524741a39383eec3a530d60db13deb26e3523a725f0599b671b625c07002704fb600b77318417d2527537359d122e22a1f7581eaebdc19e65ba50bdda18ae08e9a8694fcb0ff1a2cd98d910dbcd52064c15a4282d67b278c72a0fdbf228abf6b519dd28ac21c57d1da4bb7ad5b5ab10da6b83132df1da79ccfc77fb45598bbd91ef5ab96d8a2ee148639a562debafffd05aa5d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee00000000000000010000000002faf080ab009f4d0b317a141e5b3f865599676f895834400b66dd09d33ad27163ca176f00061b1000028fe56ab181f454372c939ca0516f5782b26cec2010885c70e55c41a1e43de3af6635d2ed0bed90837cefa9f1805f4808e8092a4d44efe5fb616ff7678487a460b367134fcc728ba273fb1d22718bc6a95e47a120a6d952c7c2cb8f38e59c2a4efa63977cced7e4b8f46e4d47d29098a73beee807c3337c4acddcbb32b78eddbd124b2f33ec6cd8bdd364aa4ad2c10eb69dab808fe5f5f0aec19750e51ac65a8746f345c05d4b8823ffbeadd6200ad01449c39a008fbe117a8ee904445488811336d0c439419fa4f285f9f62a34f10b076c99c0092968e3cc9fa656016b6da049bd56b910d7a9356e76d24e746b280f0275ec9e9bace82d852bf0a137ea02d4cbd3b68450bfb593564d8c20953bb758890a55a8c381a4b3303b61ec26a56111361bf7262b3f6f2503aad06758130d86ea607cdbba53415aaf253430d92fdd81c685ab39233e94654e6508eec1347747e2df2862169382aef6f99dd78b50629c5d98b1fcc73e865679d862b42f8e9d54ef6288ed2c3f2713f0fa4db538cd3e70ec1a30cd65dbf873f581b30892acedacd39b5f0aa774d1f3f77d8fd11ed628bcd02ac33f89123595aa455ec54a07e93e26f94338fedd8bb84094a0add52f912ed5f9019e3a28d90d251cc6ed7ffd35254dcadd9f1e9b28eb0e06fd4fe961d60cb690a7757f475c08aef07c2e54668121540a42a9c779623709a2124629e8c4bd4021763979647f625b360a4559dfd3f57798dfe5d36e9d902904af3ed67d8f4b0894538c7718f5160d211cec27375a7e6a2ec42f2c8fcd1c953b7b8379d42439a2c6b921a66d5102ceb6bd6bc20b17098e69a0a4f708b42520e4792474c3d115a12c83ef60ac6e69d8842c5981e9a6d178efa352e73e4a34bed4fb590dbeecb259617668e6ffb9f955297f26e3a6a3b95d9617529a61f08666ca1069d2ee1876337d3e786244c5bb45a8236577184584cf3018118d7e4e78973ee510b6773bd922797e580cd240dea3ca31892d23c1e6e4fa92f1a01da8ea40044f5613a9429ebe7906f79b32636204d025115810b376d4c6436da136b96c7c10649e3290caecd6ca14d995a817e3725fee7e621c5366f80c752e50aeffee1af3361924f31cbb1cb44731d19963ff30127ca2363ce15e50948be14c43400737ee8910ed06027599da74b06e77eb82ac523cc031c57c02dd82dbc0d53629d072615c92034cf829e7a5d4437b1f58e2bd4b16993e1e1b05c26ed8d695351db11d21df36a7f5811ef5fe001ab1e1c6ce9d2b69b6ac3af8087e6666317f75b645e3b1caefac0eb65327fcb9fa62be341c99f191cc869e48dbc8fee3e42d4393cbc6505c880dd6739a69be4f7ef3de306480a7a51f413d310926f252ea96a0c772d8b8e94e7d6cedbfbdb21fae2ffc379eb17c2680fa2bc56a8726c93e7bf2d446221ce95e49da93d29bec8e53ddcfd262c33d556c2b8921c3de93236408b462d28612d3343fbb9cc538b1e6b33c341c3b91dd41f936931e61f146fd00aee1c5c0de97b47cf7efce889012e1c22dd8faf0fe155f4e9930c27941d8b0907502a835bfffff801f6835de69ad33e95232f773219eec0e2374c421230f323257dbc91629c4ca8a61584f737b827fe8e8f5b69b88a7b64b362f8142b043f08ea82c4a0ab7c4e0b9805533e806f90597095242ff64f314801fb7ad838e98e1859b2c05c9b027ae5a4baf780d15977bc1492dee9b14b1cb0fb3243eb2304919486fcde89a3cf35a64e31b1698e35fbb8528a73526a19189d406272b8becec94379f69372afa99d06bb4f34df72e1c3b49557855ae8ac265160bdf48ab34cde30d2665891cfeda24adcc657d851431f38953f917f1a111f023d2c71845ccf25a562d2450bf8b4986b64ae4fd09e5a8ab9610d11fd68e9d570b3a467780236de974c7fffd05aa5d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee000000000000000200000000003d0900559bb949364ed92a64f449cd6ee3eaba2e607595d3cecb36b06b145baaa69bc000061b100002860fd058656f185036e81a64fe19034d29223d3620bdf4bf2ff3c1def9c6bdd70c2cda7f660e1b202672741bc3258b04fb755fbbb1350261e7992bce930e256bd5d8d4fde61365b7b24904b788ef2040fdd6eb87f97c2d2f29eab4291d9a28b5da306f28b98d01d93517b203a028199d423a3545aa17522c63247f73af7b63335b0b48e4b875c69b42f4cb1573bb3e5fd68837f90c50b0161f067a9eafd9a0790e53ed5053ce60ffff410e4b16a4b7bc5a52c57e78ef266100c9f79753f81878c08e5dbd4d80c6e46a339578d8ac8c572df77ef614800cedc460c06878c0da97908067729ed35e3afe919071724f89ab736f5791a9c9b5d422136332213434c836e2ceb9fce0e2e96a9a6d7befe8c132867d5fafea1a7809ddd6b3a89c8ef6ea83028d3e2cca00f1bc6e12ea8b67e91a98acaa2edebaf6dd3a18c655b6b1fbbff5c641f8002780758d05f1f39c9470a124a5add314abd2262142733120747cda2f1d9eb90d68ecb9c7fbab23d73a35f2a20a2a365de6cd678d53bd5bd9bd518333d04e8e678b5d08f028982dad08c80be7d8fbb0638dd814232224c687f8321baf96ed8b39a1e9ab52dfd69d8eed79ac3f5a2c480a585bff038c92b367743317b937d969cdd533ae1d797a789ff7994f86a0d6cae470b64ebddbc478573af347a110dd1feaaeb4779441ec439cfdbafaba870105efd86b9d85a4df7ddb9b09f5b6b4144cd1fad5932df37ebf19a62648659fc1969142310a5cc9b4d0c48ba6bb0f863ed53a0b75fe1ee6515a46993f95be2e34166408b54a43e55c4802b37ac902fb4c8367ce38990d07ed3104d0728d327d3b9de6452b520f9af534505885788109ec78c1176ca0864d28422e826cc83f821b7eaf028d6a7e350b3037d0fe58d1d4e18113c8f61913932e71c0f334402534d8663f15445f900fb9dc6b3a93223868167be26fcbd70c0459eee37f81fd539c319eb0b04bd478b94b5f4cd23b4d496c2bdd6e8a154fd76c4ecbdf7647fe9e7be88c6a3a8e7696e2e596dfc25ba798db6ca331d135e9ce7c0aab9721d3f70ca53354f96ecd028236259b9b0d9e0bbf73c8e841b1d4276214f7be8feb525c91d39910b0e091997a2b89e945806e93cd325cb51463b0729f1a519334038cba09653799ef533a49e812e86b81af7e5099a02ca11c2b17dfc8b9e51a57a20546f2c92826676ebcb4f64fe7cc77424388dfec7199179cb125bb4613c8bf05edc4173987d7d5ae0fcbfa08a1e5ea2d6b01406d740b49c5b1a68da585549590c3ec13479efa3136c5ade68057fe173ace55593ceca8440372b03f332969866d1bfbce3fe9dd907d27593b8b2ad25eb4b12afd0f3abe7931ba7789c84a3ed65a03df06d998a9956043a4de786c359bdd58f0b9e5cfc32bc709b626ce8e63f3997a0e9f784f6b94e342b4710553e805cc8399191254189058ec75a15556467b2456d9b38a7e4d15cf59727ad2c32f0daaef1748be04311ff484479eb31f7eff9e32b816fa40f40430e801c15e931294b39ec4d6c93e8130fb4a1b53ca6471886a33b10b46d6973d02bbe3b39345e121473ea4ba41f3cfced07c3a613393e38b8ca01c353ccab96128093bb5fd000978b11ae6f7c1fedf48c3682119d1b44629d02ea3800d2e247ef1e78e527e5d574b4dd144e1fe1b0c6551442d419baba300258657792947443747b29b6fb9417d3c57536de6aa379c02f3addbd2066554189ca817c7f57331c972c30e3ed06fc7e521b8e2bb57c023dff9816f260a153f1ffd55df2a2fae568f3dc734d62ab47a77c54772b5e4cf2758c912cb473ec372173d9eda0c58b103ab12d11dcb976a40816ecfa8b9c9384f6415017555933652e77ae20e14ea9ac25b5811fc03364c4883bb78c82e29f8a8892415ff652b782642bf6036b3e2200e00fd05aa5d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee000000000000000100000000007a1200ffb841fb291ecf09ae7b5dcec1feeb45ba196ca02d6b9e50ae2b3dcd9ca5d72500061b100003acd0a3acb9b4f9540678dc9324480bb3d4f54e5e007739c9c1d600bff75dfbbd0191e75c0a2d810a6ec5b03d02cffbf1a66123c87790e66eee8d416caf82e7ea7090a62fe14276fa88af32ab9793f7a100de5525eedf71967c13c8d361246d98b78cc74383e714f88899f34407644c14874046b3b722186015c07b8db042db955c91cb14abbf3cfa646aea81ad15bf67108a763539c64c5a8e8115d46e063e956671e8ea8d8fd638a6414d71e9b475ebe070da7faf75a898f29048ab5a2b6c7e3a72a178b8e470e8375f539ebf6284d15486c5a8774d46ea164ba2b62181f47623fd987ff5958550c962a193638679b79fcd477fdf2a09c0fa879bb22cb493fbaed27518f5cb265741535b4ab14246077ca18f11ece7aaa0e01ec5bf02c3c3b541ea08bf254df123079c1538e266dcd3161bf1b9ed41d873f1491906e1459ba51ac9dd95e783598d3c356e0cc5b98c2a96b148f55f102a9810181eedd46cd00b445d861baeeac46eba469435aa4ddc877bd68b53f4d005aa2566d356cc344aafcdc86abd774ea28cc838d2fdc541c4b6da494a96e128b8c2abab4b21b3ae2646cdcc3528ef6fd8587b3a0636ead67a62309fb003afdc14177d329b062622313e9dee912847763c68678df663a39b89c69efdb6d916d5754534bdca9030955cbcbae6fb7ff1df6282175cd37a30a904418b976af05809f0e0e7e4b4e2ec018f1e9c6bcb" ++ hex"e7a7822c8699669946f5e684671d63e68cc7c9cca2963945dc21c52232e6f83b1875b2bed7c80c37371a480a2e5255d49d390c3b2adfc695036ed91371cda7d79bdfbae464581f0b32942f03826aca17ab9da6ade4a778d310ec3da17fc3af426d21b347aee7c2db7b5e188e35714dc514e3a1c100e8595c9e0e4399ad796021976f077e5733ea535cc6daec2e371853dcb715fc366ea7d6b9a5b3509dccf5c2e1225e3a51de9f5bb9b6586b282a0b27a9ae7ae8f2be14ec677670241e384b462eecfde68957839b1327c9e5c622c0f67cdaf3845ddbe6f754401d720d6b6d5c061dc906bfa70fb76e1168c6ac1a25cabe8873c3c1e540ae44ae631a2638accd7951f368442dba7b38d0662ccb0140d1e4ca23f51de731a6f5adcf816c3235359afd607e58948da29a5f06c96b4312aee7d35ed4c2c811a58c5a196ac2f377d653d51cfccb5213c928955ac880b5fb1b91e88a52d5c217cbf78e071275fe626c230fded548b0f1667af1309149ff74c5542119d4e269fdc1b241d9f53e02e38e015b7c5c2d2ee623bcb4167e37edafddc7fadd642c20f81b454db1a3b578d527f124dbd1f3d99fdd1590256ae4e47c2e8b3bfe8708a0d5506d6ce8b130ce6b70028161454a5065e9925d75c0095dc24ba789489fa1e9236e25330ca1a45e61224ee027664f6589028a240961aff09187fb719ff3477b56427189b7b3c790b4031f6539c5e3a8a5d7fd99c2534ed1646920a43e7315bba98d59c51b337ba7a1b038006bb574df46830f96a5685e07ee8a0a41e712810faacfb231c67e69d0fc24b98d782c70e15524d5d2dcf4e64b4e26772dfa7067f6dc7ffc8b06e6ef3ecb13f927d466e0cd3a7ea09aaed90b7810bbfdcd8a1274bbe78a453ffff11ccee62059ec25955b34a1a1cdf8a3e506d99dcbadf16032646117556ad71cd93ceeec42be0350a6c9f194fea783558c42a56d034dcaf6fb1b28037362c7c6e2446bcda71d0a88adda3144589447ef13cb85a4d2cd16ef444097bc03e32c3b1a055e952f7ac87078b04deb900375a16dbd382ea4375ddc0a9645deca620590337e803ea8b41337f3f4e4030119a2337424dbea3d21214063ce853843dd4e6df94e3dc3bbb36d89d9eb8e15e52d0699bc6ad1de9d12afc95c8785d63756576d357126e13b25502d542774f6e5d2fdb559d52698d08600fd05aa5d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee0000000000000003000000000007a120bf5899359b258acdec0ea500e437267aa6ba18e8509e15df74518f6ba7aa348f00061b1000036d768d1d63f1c9f09c252b5b48cf4d2db3f4935150c551391b37727723168982d7e58ce2a769313e461a0f3791a8c0208a769f5bdf4d57fbd0a9de104a0b1bbc1ab25ebbf87d1bc86dbbd42fd0dc0ff18a7ebfdd692c7dc3b95d095052540ce7801f3e25cbbcfd9dab857bc39624f59facbfacef5ab1e1e1f889b85f3b1f2a580cd660b73aa662fb15487722bd3c3f93d272725289136f2ee0fae4efe1afea25e6d4fc8334a47ad62d22be06605a15538dbd2a81311c4489b91d1cb143743e4570a6345c4f035c060aaf287ef66e7ebbe7b9037c10b66e087827478fdf76a02d25fe90e0f8228c1edfcb12eee3dd4e505a6c5a7bf2f5954ebb5560cd8c7f8b8f3f4ddca41a48a0d6c0e1092dcadc853752f459486bed349213cc15044585255842717ab70a3de3f0eedeecca10112c85a8bc248dc66c883a62288b49588d9fcc048c51081e94d65bd4731e7d71fba13693b82d2831d3bea370918aa5ddf1cc4f0d5015bb8dfb951ab13fbb9d26d5cb83dc980fc36f1712d616ce24d2c530253320f4f322f093a605ea426c577544f2983efc80be56791f443652c2233039a68f966c2f0b6351068616755dd2036b6226244d394a2b5b59160217603149901e8abe19a2bf404f384c2ed7fb0c5e470ee5ee8561f58f66bda729c2c8816853ad2357a009e537efcb4a28e845ca616be917b15aa6b8eb280bfcb321ea62fff21168b8ed54d58ccfdeee0e7752bfc0f02549d76615c85dd1e152a85ee931b34f436439e2233740328ba504c49f9764e1dca645ebf6a1377310ab53b68b4d0a6e6c952068249b86c29061725035db8d294ab9c56901485814735aa2a8d6987b1a19ced65a332f97751c4cd8a27093851f7775e5314078c04d254754d976bed2dbd2e6ecda62e9a0c7fd95299b4b13a54c9498d384210fb42d3b6bc5d8f0d42e42879f86c21eb7c5c6d1bffdd598b8f3cfcb75df159f1125a65f960637c62c7c5632d73b7b4b0544082008ede22d87e79e20eb08be0817650fefcd111de48ba2be02a7b080275c991a0ee4445dab89312644c7cf4101895e2dbcaad7d87e8e3b13e62751861b204a7e6f5a476eab0817c294d59aa0247903077d4cbe4a98e7984d2b04623d2b2ef4c650b43db15541ede229c12c045529b5c77993eb6acbdc28d812a486b5957fb996731980555bdd59ad824a882ebe1a77cbe6b9035f1c69dd01b2a27a47be5febfa65c721354e70071b07db4ebc2f01d143587c1b32a5337dd010d2a76a7773f4a7c665b4cfe4a61b103b1c319d85e007eb99b52400cd8776697e1d6118197655bf7bd0a5e7f4594bf36a2706128d5f5c3ee166b586c4d515611f4597a4c1088c1853a5959f73830cb973ea922d6211ee7d9b1d67b1025486f8f3c72a517d0d48d9a57d64c0f48e513c3b09e14ce91b515a87f3035ab55d241ccb12108dd299a362af26af96ada920202dfe26d456065717a85e6bbec540637059d82480f6c917a11434a9be5fee5ba33a8552b7b0e59f123991525e1dc14bfdfd109625b2df477bce565045375dacf6ffe99081914fc9f64df7ef8eb26801ce01be083555fd2f8a338a33c07f484b01a310ee420f5c932cfc5a8f6d32a20c3915a188833ac5775500c5d2b73e4ea595512e869f91f83de8e048c804ec8cd6de45b7ad264bcfb3c235325d3c09673a2a94e60736ceada065cefb1e355bd35bd4b56ae513343e85a3d840c2211da2d1941112318f97f825e1714f74fc2d33430196cca2423f43641b0d75b4b1a1a1ef0f07af31fda06220a2628aaab9f303cb4fe6d73fa9b39e8f6083af3bbca1becdd646afbd888c560bbf7cf4fcf5c02f712726eb23b03fe5c290df63a85ed1026cee07ab0d2bb868aa4dd6594252cb75ad5d11d9c53c5238047ea3d311c1443d478dd283a260270400002710000000002c2322200000000008af34a0245d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee000000002b40420f0000000000220020c57347ca54a9e6f279f6a1f1e50f19b48289c3baccdd356fb03033ae7ccb6e444752210252a01d9d8b03db1a99b1a82223f7dd60ecffa69dbef47c06228fdea2fe0f0215210322a747c1d7f77fc7577a689618bbeadf28b941412404ac5e216d684a32d57a8e52aefd01d9020000000001015d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee0000000000e136df8005401f00000000000022002019cccc41d4120d54831ad41b091b1e52b8902711365f1cbd9a44a7b5a3dc22b450c3000000000000220020653fa8ccacaea967b6bbfe9411c3f812cb44c4a18d4f6806fd81512009f706e750c3000000000000220020c9c8b5e68eea1a6f32394124873d68c66b1cab8ffe657c852696e1a1597783d924390200000000001600141fa232bbb376f103dd015631dc8d6f4f9d306122241c0b00000000002200207121fb3dfd089e1a7b7cf0934e4cc42e99678c7db90927a358985a6471d0cffc040046304302204b7524262f7aa8fbf4e9fadf476ba42b4202617b16e4d1e1ac7c9db1adb8a126021f59622119b96d12a66c6f18f12b5c04764c576f9ccb4216049ddd6e719cef9201473044022003f76c8bbfc91e5323ddc1d7a95e8a3c7707de898e6a50fd5e6562b8412e32fb022010b2bb7edcf519a9451b3883832a39a0f9008903b52fb2db90e6e371bf20307b014752210252a01d9d8b03db1a99b1a82223f7dd60ecffa69dbef47c06228fdea2fe0f0215210322a747c1d7f77fc7577a689618bbeadf28b941412404ac5e216d684a32d57a8e52aec34a86200003000324489133c313ebc91202d43a19b2034b1b2df6ccc257712bb0c38cd1d3141e42ac000000002b401f00000000000022002019cccc41d4120d54831ad41b091b1e52b8902711365f1cbd9a44a7b5a3dc22b48576a91423ca5b93a48d00f645081be0479fa799c70731a28763ac672102897afb6799af1c1af49fe4c96800ee1cea77553c0b5ae9b8cca5347238cf5be77c820120876475527c21035a26304d46e27993c218a0c644a613ca87630c8f0e1db5f112a01c3af26cdb8f52ae67a914d3260c3a0710948e34d708a99ff708f9c257ac5288ac68685e0200000001489133c313ebc91202d43a19b2034b1b2df6ccc257712bb0c38cd1d3141e42ac000000000000000000015a050000000000002200207121fb3dfd089e1a7b7cf0934e4cc42e99678c7db90927a358985a6471d0cffc101b060040ac4bb46e1b736a6fc76a4d86b24df1e9f9f91013025209ba64daf333863a2bde59a51a7af931bf0b07d6154daa30ed3a9c8c33d173c75765b46674a4e249bb734061aa4d418884ef272ea2bd65d745c42b5bd5f6781b7f876402b10eb505c60d086ddf3e108528e65f4712503114c24a20c8fab7867761677401defa780c4574f5000324489133c313ebc91202d43a19b2034b1b2df6ccc257712bb0c38cd1d3141e42ac010000002b50c3000000000000220020653fa8ccacaea967b6bbfe9411c3f812cb44c4a18d4f6806fd81512009f706e78576a91423ca5b93a48d00f645081be0479fa799c70731a28763ac672102897afb6799af1c1af49fe4c96800ee1cea77553c0b5ae9b8cca5347238cf5be77c820120876475527c21035a26304d46e27993c218a0c644a613ca87630c8f0e1db5f112a01c3af26cdb8f52ae67a914caf9c0d315f1ca821720d6911e090095585cee2788ac68685e0200000001489133c313ebc91202d43a19b2034b1b2df6ccc257712bb0c38cd1d3141e42ac010000000000000000016aa90000000000002200207121fb3dfd089e1a7b7cf0934e4cc42e99678c7db90927a358985a6471d0cffc101b060040dc5ef2218b256e0db9981ab591cf830819b62ae2068b6c4d19a85ba03153ff39316c14c1570a8fdbc2765b38a16c74e76ec7190f47aa3754e08c770d8c7e918640678fd252d77d34b3ecefff1fa369e92dad0b4a2632efe13974e538e13e14780c4c6c21838a7ead4878c9836405e45333651de6cbc012af4d6c1bda4a0039d5aa000224489133c313ebc91202d43a19b2034b1b2df6ccc257712bb0c38cd1d3141e42ac020000002b50c3000000000000220020c9c8b5e68eea1a6f32394124873d68c66b1cab8ffe657c852696e1a1597783d98b76a91423ca5b93a48d00f645081be0479fa799c70731a28763ac672102897afb6799af1c1af49fe4c96800ee1cea77553c0b5ae9b8cca5347238cf5be77c8201208763a9149bd34d5a8ea2d91b8ac4d1fb4ce79bcfd481c1f088527c21035a26304d46e27993c218a0c644a613ca87630c8f0e1db5f112a01c3af26cdb8f52ae677503101b06b175ac68685e0200000001489133c313ebc91202d43a19b2034b1b2df6ccc257712bb0c38cd1d3141e42ac02000000000000000001daa70000000000002200207121fb3dfd089e1a7b7cf0934e4cc42e99678c7db90927a358985a6471d0cffc00000000ab009f4d0b317a141e5b3f865599676f895834400b66dd09d33ad27163ca176f401e7b146982a595ed1a95e1225312dce24f45237477efca22c759c9cb16c4a6bc1c9e8834a18eb0c6c389a14ea03fb7062f788003c5c58e738d78e28e004014a64013f1f51471ecdb32897a5f604a254334f7f5fa26de5fc63b96c942db2196ae9e43b34f00054e0c58a061d5ae5f4938b5d449b8f9371edd76efdfcce758a102c500000000000000010004fffd05aa5d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee00000000000000000000000002faf08011b29e60a38883a8d4434f17ca3d92161109f7ddd8799e64e86d6b8509babd1100061b100003b8c1771721551fa88af8fdde92909add6e5b8fa90a4b0484ee065ed3ed7c56e733a7fcd775d4ab92956c1328ffee9c195004c5dee5dd5b9d0f9034589e6769e72579d3d5837ad70785ec420b4a24c04d36668728c0d2534ff1feea9aac2410423fd79c7db9231ee7efd3d585646e378fe53d731d18f38d6356a970f5c3026edc849d49ff34e58dfb7548512461110088ac3aa800e10785029ba3b0e9ab7bde0f056939e4921792dba2f5c005135daf57e32cae06a9ccb1b4d321f3ba015e5b92def1ff1c200e56b3990d82570586bfae26e9398e17dc6c069f92d80e6dfedf6b2f24b1dc3cc9d63e684d861f40fdbf508d4ac34b7f10c57be2a9b0c5921f86869c29ada5394b8780d2488a4fca3cd98ddb0ff8ea4415a07caea436682835744e94d5cff6d3024a9525dbd697e499b7ef23062b18b225bfaa4c5bb07166f34ff7866ec8f0fbbc12f695c609692798364fa20bf7977e321deda3fe5510833494532fba94fc1f0dd14ec74f3e9fe8ee659634621b63d16d46a8958132c24bd82c516bdf9ae9515cebae42778e4de6be7047c31cf86c0df0306f7b6562e1f35be51e5e64cc6d9d4c010849e6ac7ddacaa4b7b6fb1d35aac815964090940e73a1193eece11c1c1d37e373ef58c5e2d690b6ed6338360af9906146da9db8329bd2786bbf92df10445ee093f0b1b2a640cc2daf003fa7141435ba1dd54f9cdbf5417fa7f539b255452852a85d2ce97ce5abed4980e7b409e283f97ccc9c01e104b55155f96ace6789f61c4661962d34fc5d7e6f5f5233180933b2fa7f7a5b074714645489f5221966160946b7bfbf0fe6733e6beb8af4457b9d36cde1200811009ec483a9d730ca980aa28f636942af5e89794a8edbc1b75d555ba134974374d0fe23d31c26566064eb9998d649bb2bf066bf710da50672f4e3ab4df843a0c8942bad0a071c237d4c1759eca37380919e36aec73284db202a32d3d1619f3e5b757b2df8b04bde567783dc8e465d996799782f1a1b8de9331681a35aa04edb427de87264c8ae9c397f29d3e8730db91256425a10b960a9de1a48d0d4186d617d2b69c87e2540f6570faff4ee1f6303d7d281434947abeaad83c86a4d25bef4de2bb3c6104aa0ceed7c8df039f4be6a42851a118adb1b8f98e02f6727b75d98541bab2ff24fb2f20342e86150c678941825409b62a844f44ca1ccdf0d9f7c2cf9b222fbed00bc92be0802fbfbbeefa71c8976cba8fc4aeb031480f434027b1cd593d08cbc14c2a360b736b06b5afb8da35f0be3818fff4275b8c830f5248a8b8edea1327454e1360bd90d4fa08e965f459b0b027e1180290cf762f813a31e8109f472d9657b03af737d1f7bd2e59441541a84ba818f1413c5cd1f8b9882e9188e0def9e44e2f4a7c710c893c7188ba86423f8ae86068d84e1832af548289e87c34d68b186df7e24ca5b051f8f5e4a44e2e7383ba2a09615b4147b34e86486731290ea67f3be24c13a9c5cc37f06555989b3f10c580a9cd2b416d0ee4210855c6833a25996761dfabb036f3893cff7db7e310baa8faa79f46e0ee43bf4dfd732eae7f44bad2e7c032b9c6d14947af6b0e37e5ec98372a622f716ffba0cde04b9d4508392dd154ddc34829412bfa604d4f00e4b10a553587343ef5c0944165e7ee1e34387b09c147ecba943cf36dbc4269efe50ec3a5a3075c43be9651d6db6acb9f657476952b78c990557f05935247a71077373ec436ec586def177448f8859ba096b7a838e5b4ce7a463f9082f705c26d99936eb1be584ea9b58a44b9b4faa07fd8247fa66cf4529d1b8cdb92ed7bd96bf0968db4376489c7d46f0f27d58ac884c29736502953723ef1ab41e19c7041d3e0e9091d7de2e3904d032de02292edb1225a672ab438d3c65f7921c06a9f181f8ffda4ac524d0e0fffd05aa5d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee000000000000000100000000007a1200ffb841fb291ecf09ae7b5dcec1feeb45ba196ca02d6b9e50ae2b3dcd9ca5d72500061b100003acd0a3acb9b4f9540678dc9324480bb3d4f54e5e007739c9c1d600bff75dfbbd0191e75c0a2d810a6ec5b03d02cffbf1a66123c87790e66eee8d416caf82e7ea7090a62fe14276fa88af32ab9793f7a100de5525eedf71967c13c8d361246d98b78cc74383e714f88899f34407644c14874046b3b722186015c07b8db042db955c91cb14abbf3cfa646aea81ad15bf67108a763539c64c5a8e8115d46e063e956671e8ea8d8fd638a6414d71e9b475ebe070da7faf75a898f29048ab5a2b6c7e3a72a178b8e470e8375f539ebf6284d15486c5a8774d46ea164ba2b62181f47623fd987ff5958550c962a193638679b79fcd477fdf2a09c0fa879bb22cb493fbaed27518f5cb265741535b4ab14246077ca18f11ece7aaa0e01ec5bf02c3c3b541ea08bf254df123079c1538e266dcd3161bf1b9ed41d873f1491906e1459ba51ac9dd95e783598d3c356e0cc5b98c2a96b148f55f102a9810181eedd46cd00b445d861baeeac46eba469435aa4ddc877bd68b53f4d005aa2566d356cc344aafcdc86abd774ea28cc838d2fdc541c4b6da494a96e128b8c2abab4b21b3ae2646cdcc3528ef6fd8587b3a0636ead67a62309fb003afdc14177d329b062622313e9dee912847763c68678df663a39b89c69efdb6d916d5754534bdca9030955cbcbae6fb7ff1df6282175cd37a30a904418b976af05809f0e0e7e4b4e2ec018f1e9c6bcbe7a7822c8699669946f5e684671d63e68cc7c9cca2963945dc21c52232e6f83b1875b2bed7c80c37371a480a2e5255d49d390c3b2adfc695036ed91371cda7d79bdfbae464581f0b32942f03826aca17ab9da6ade4a778d310ec3da17fc3af426d21b347aee7c2db7b5e188e35714dc514e3a1c100e8595c9e0e4399ad796021976f077e5733ea535cc6daec2e371853dcb715fc366ea7d6b9a5b3509dccf5c2e1225e3a51de9f5bb9b6586b282a0b27a9ae7ae8f2be14ec677670241e384b462eecfde68957839b1327c9e5c622c0f67cdaf3845ddbe6f754401d720d6b6d5c061dc906bfa70fb76e1168c6ac1a25cabe8873c3c1e540ae44ae631a2638accd7951f368442dba7b38d0662ccb0140d1e4ca23f51de731a6f5adcf816c3235359afd607e58948da29a5f06c96b4312aee7d35ed4c2c811a58c5a196ac2f377d653d51cfccb5213c928955ac880b5fb1b91e88a52d5c217cbf78e071275fe626c230fded548b0f1667af1309149ff74c5542119d4e269fdc1b241d9f53e02e38e015b7c5c2d2ee623bcb4167e37edafddc7fadd642c20f81b454db1a3b578d527f124dbd1f3d99fdd1590256ae4e47c2e8b3bfe8708a0d5506d6ce8b130ce6b70028161454a5065e9925d75c0095dc24ba789489fa1e9236e25330ca1a45e61224ee027664f6589028a240961aff09187fb719ff3477b56427189b7b3c790b4031f6539c5e3a8a5d7fd99c2534ed1646920a43e7315bba98d59c51b337ba7a1b038006bb574df46830f96a5685e07ee8a0a41e712810faacfb231c67e69d0fc24b98d782c70e15524d5d2dcf4e64b4e26772dfa7067f6dc7ffc8b06e6ef3ecb13f927d466e0cd3a7ea09aaed90b7810bbfdcd8a1274bbe78a453ffff11ccee62059ec25955b34a1a1cdf8a3e506d99dcbadf16032646117556ad71cd93ceeec42be0350a6c9f194fea783558c42a56d034dcaf6fb1b28037362c7c6e2446bcda71d0a88adda3144589447ef13cb85a4d2cd16ef444097bc03e32c3b1a055e952f7ac87078b04deb900375a16dbd382ea4375ddc0a9645deca620590337e803ea8b41337f3f4e4030119a2337424dbea3d21214063ce853843dd4e6df94e3dc3bbb36d89d9eb8e15e52d0699bc6ad1de9d12afc95c8785d63756576d357126e13b25502d542774f6e5d2fdb559d52698d086fffd05aa5d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee000000000000000200000000000f4240657c0bd97e795218aa623b27cf9a71764379c4762fcee8993aa0b1ab1e32194a00061b100002c0ec5d388a8c78491bbd870faa2c46e4282e11796123b69c2792e5806748ef068397f0212a33e3f79162ba4ea247ccec410db039dd323af48ac27bd0ba77ecb870c587477d4543d9a29c53fc02bc98d7cd0144c7abf80b999c22b42a28ae8d625478ca304001f9a49782ec970031e673c76e4e27357a321729d6df38d1d88dcbf764c69eda3baac9739bed637010f44638cfe1deecc56b76f6e02d1d0c3f104462b9ffa5f20de4cf092d86a5bb35d5f62b0fb1c983a2c06df17c9ffc809c83e4b4335f5903fab536fbd9719847bb063541ecbe05c12ef8d058b3547faca054e3d662250f1cc1f925dd71297abc25fe37ab33a086759fac76208a64552f84d2e4d84daccdc3aa2bbd2c2f922bf262596742dfe034529d1ead2975dd3d197ab0e2e1c75c8b8f160ca6077638022d4afbd107979949cf342cb399347f3990029f0db6d9ac0c569d61d42539371f9a7ff59e9c83ff97d15bf0eeb254ae58fb7b1f9d8710c546ac8a227930c66ac841bc4f475229e5cadd14ba5a01e6b2da99c55861a08e2100e62c4499d30003fe30ddaa347d7a27c2158d3787d58fe51ae57d797bbef7f900508d1580df3e5233f0887567fba1faa918c246d2ec5c3b7aa022cb8a652d00b4d719e312482f57655eee80a90cdc73151fd7ab9c5367793d60c6088fab98f0547d7f547e10db202a25e027a5cd0abc41bb0e3ef563c0a6d469a702b2a26f0e8b4fddb845a16a5f06b9dee33c3adb31430c94942c5023179d3e4441948a332069a1c3b69dca65f05a43452e42fd28a2f7e6344f98ab9a7e4eece3c1709be1f7bb620f8b6c45989a8bccad39a4bf40e8215183d1449196f1f9fc17de778b616856152e6e6145a1b7a3d7f226becaea5ebe34aa4bd06e60f0fed207bfd21f5663bfadd37dd722437bcd46a26fb4e19d062574a81bcd817eecbc1914a5878809128961acdd73113ae9c51070ff4494e16d81ccec777eeb513da82bf43d4884812b26546b4370dc315793271b069f60f4285f648cf122ed8b22b0c7a27e94ccd59a273eb774c109e19980e146850de95f82cdd8aa0e82022672024c917b281422d284df0ee0bdeb3d4ac56b4ca675ebdb835c17b6a822d79ae7310f4aa41d80ac61c5e45c1c0e1d64542622a31091a9f87c335e86d964dd85a951d7c9bf41c9f2b1a9bb8424d7d1b26413da8034182fa42d2b1cd1f8745482c49d8348d19c72cf5a02bd28e4cba82128af8bf5d9c1215c4f543ef4d185f100f8d803dfa29c300c072e44ad9542b82fb1380d55c15c9a4b4398876e2450b90b49990746f339abca8cc8a462b62329a128758ce0e46b5f998af1bb485a3044bd125424eb5c623afd2a11befe4ec544eafe275ed1ad82b940dad5e9a9710d48562e51b296ba81f2d70593685ba0e3f3b25089a187e61d5675dd481aa99620276cb0a841a3c4df201a929287b1127270c5d25d06fb286dae1a9a5a5cdb60003f0c30d2021074bf252e550685f7b51a087a77b0871e883104e55f898aa5bc4cf8538c293253a737556d7f220e15b90cf0eda7d5f2172372e3c50c12cc588f312da37191b5038e944825044b130bff281ecd47a4252a1411ab7a9305c2b37e9facd435e9c434de37641498f8e4bfa7b42966da29c84200aca87ea1c3b00db54906b340e524a7dc4a15403bb82bc24517cb91026096bdf18f5f7ae5640ed6de1f0c5d184813d6b9d244b32b58e9ff524741a39383eec3a530d60db13deb26e3523a725f0599b671b625c07002704fb600b77318417d2527537359d122e22a1f7581eaebdc19e65ba50bdda18ae08e9a8694fcb0ff1a2cd98d910dbcd52064c15a4282d67b278c72a0fdbf228abf6b519dd28ac21c57d1da4bb7ad5b5ab10da6b83132df1da79ccfc77fb45598bbd91ef5ab96d8a2ee148639a562debafffd05aa5d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee0000000000000003000000000007a120bf5899359b258acdec0ea500e437267aa6ba18e8509e15df74518f6ba7aa348f00061b1000036d768d1d63f1c9f09c252b5b48cf4d2db3f4935150c551391b37727723168982d7e58ce2a769313e461a0f3791a8c0208a769f5bdf4d57fbd0a9de104a0b1bbc1ab25ebbf87d1bc86dbbd42fd0dc0ff18a7ebfdd692c7dc3b95d095052540ce7801f3e25cbbcfd9dab857bc39624f59facbfacef5ab1e1e1f889b85f3b1f2a580cd660b73aa662fb15487722bd3c3f93d272725289136f2ee0fae4efe1afea25e6d4fc8334a47ad62d22be06605a15538dbd2a81311c4489b91d1cb143743e4570a6345c4f035c060aaf287ef66e7ebbe7b9037c10b66e087827478fdf76a02d25fe90e0f8228c1edfcb12eee3dd4e505a6c5a7bf2f5954ebb5560cd8c7f8b8f3f4ddca41a48a0d6c0e1092dcadc853752f459486bed349213cc15044585255842717ab70a3de3f0eedeecca10112c85a8bc248dc66c883a62288b49588d9fcc048c51081e94d65bd4731e7d71fba13693b82d2831d3bea370918aa5ddf1cc4f0d5015bb8dfb951ab13fbb9d26d5cb83dc980fc36f1712d616ce24d2c530253320f4f322f093a605ea426c577544f2983efc80be56791f443652c2233039a68f966c2f0b6351068616755dd2036b6226244d394a2b5b59160217603149901e8abe19a2bf404f384c2ed7fb0c5e470ee5ee8561f58f66bda729c2c8816853ad2357a009e537efcb4a28e845ca616be917b15aa6b8eb280bfcb321ea62fff21168b8ed54d58ccfdeee0e7752bfc0f02549d76615c85dd1e152a85ee931b34f436439e2233740328ba504c49f9764e1dca645ebf6a1377310ab53b68b4d0a6e6c952068249b86c29061725035db8d294ab9c56901485814735aa2a8d6987b1a19ced65a332f97751c4cd8a27093851f7775e5314078c04d254754d976bed2dbd2e6ecda62e9a0c7fd95299b4b13a54c9498d384210fb42d3b6bc5d8f0d42e42879f86c21eb7c5c6d1bffdd598b8f3cfcb75df159f1125a65f960637c62c7c5632d73b7b4b0544082008ede22d87e79e20eb08be0817650fefcd111de48ba2be02a7b080275c991a0ee4445dab89312644c7cf4101895e2dbcaad7d87e8e3b13e62751861b204a7e6f5a476eab0817c294d59aa0247903077d4cbe4a98e7984d2b04623d2b2ef4c650b43db15541ede229c12c045529b5c77993eb6acbdc28d812a486b5957fb996731980555bdd59ad824a882ebe1a77cbe6b9035f1c69dd01b2a27a47be5febfa65c721354e70071b07db4ebc2f01d143587c1b32a5337dd010d2a76a7773f4a7c665b4cfe4a61b103b1c319d85e007eb99b52400cd8776697e1d6118197655bf7bd0a5e7f4594bf36a2706128d5f5c3ee166b586c4d515611f4597a4c1088c1853a5959f73830cb973ea922d6211ee7d9b1d67b1025486f8f3c72a517d0d48d9a57d64c0f48e513c3b09e14ce91b515a87f3035ab55d241ccb12108dd299a362af26af96ada920202dfe26d456065717a85e6bbec540637059d82480f6c917a11434a9be5fee5ba33a8552b7b0e59f123991525e1dc14bfdfd109625b2df477bce565045375dacf6ffe99081914fc9f64df7ef8eb26801ce01be083555fd2f8a338a33c07f484b01a310ee420f5c932cfc5a8f6d32a20c3915a188833ac5775500c5d2b73e4ea595512e869f91f83de8e048c804ec8cd6de45b7ad264bcfb3c235325d3c09673a2a94e60736ceada065cefb1e355bd35bd4b56ae513343e85a3d840c2211da2d1941112318f97f825e1714f74fc2d33430196cca2423f43641b0d75b4b1a1a1ef0f07af31fda06220a2628aaab9f303cb4fe6d73fa9b39e8f6083af3bbca1becdd646afbd888c560bbf7cf4fcf5c02f712726eb23b03fe5c290df63a85ed1026cee07ab0d2bb868aa4dd6594252cb75ad5d11d9c53c5238047ea3d311c1443d478dd283a260270400002710000000000bebc200000000002c232220b8e78d93ef82c5351ede6c6aceaaafb806ef6ff23deb81fd78e7a9bebfcdeb5302f6bed70479b4d98f5c93f32b382524233983ebebd14b2b50fe35142766300efe000000000000000000000003fd05ac00805d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee000000000000000000000000000493e0f81fd474bea478df0202b311c69e85dc6215f629491dd15ad0929faae2535abb00061b10000370b2714d2734e6b8cde085794dd7b41c8a9b6c03c1edd8e3db168ee7fce39493596e882b18b5b1b79c16400c6762b9856075821be6be9fab8f469f56820d8f341554400a8da7f1f1a8501902581d43b9fa6e5c68015716f718a2190b87fce41bf1b509aa61806394a42489d63c457fe4c79e7480eced1315edd731887e57704fc9102f50cb7f0d242d755cfd5a2172dbaf7f01b124861cc6d1dc804796bbb84165c805f0c0f3fb9ec97b74c2a694de56a9cf8d79d1a679260ee1169d78214b34c8a654ba22e59ddcd32beff4713de33549f035b342660405b0159a7a508e5691ef4805689140e72b8a0ef2e61be74dea5d0b8f5589e0e373cac2e2e1cc39b2121c05cf4122ad0f8b9af6fbf1de2ea26376c2650ccd306c13a7b64acbf2a3feed128754abe44658009e642768ae3d84f5e0fa5f7f360c2a1c76d26985817ae77b71fb59014a5483ebba9271cafa5e5d8031c569adeceb8bae6444e98d2522b28f6682109fc7d31cdb83ebd45e5d81e7f046df42345b49f470dbef9ed87709301d2c6131215d33a30b8d18e63e54a2aff85dd57672f8198bca6a67ee147c7d0ae649e5661ab6bf78a662fef9a164f1e332b9f16e6fb3d5769ddcbc1d1c07338d3394b9245d17618c2474e86c064fca4df00ad3a93dc051fd8c3328cde2a987798b0f22a21c90426700abeb1e6f38dffb485b5477ec44c690fa80e317b32a982fd3082253bba8595783290dbffee4fc9296ffdf16a8bf3154971bb720e78674969e9db2e0fbab9e9e13f24bc8b3af5e2f00f262f0da56de443f70398ab68f747d35370fcd8e1c0e130f7269e08f862b5a67f2c129be254df2358762ce3a947eb27d66450af51540e7721b47c8a5a86098ea64dad381f14e07aabbbc470949a99c07612add3ab4c575fe2e520bbe511a1a674aea37a44535c13ee3380f8f39bd230fc1481cd31912af36c6751e23c6f383cd37a8b13fa7df9f0c7e460739f2c6226638ee14f14d36366211cbc6a1e16b4856bf302a540aa9d9e833b1d59c510473096384c8b450f2f3f1dab9e614af822949d5cc93d76bc4d1a52891bc85f1981ef83161195ab7d8181ee4fb163bc6c685a10e87c7f4b15ed7d05833c230a4a5b63841fc65b959f0ff010e697f47c583f9b7fa9b389c0eff6614e47d85b83c483136f182be4c151d272f5d938b912a95e47d333e5de6a409ad271679a778a7eb3f169c71525302fac5d4575e2645c09763c2ef165736a7a726ca605038e2781404328790ffaacef2b9c2bf90122042cd571287bc4e3973da65fbd4e3da9e40e4347ca6eb4ef1ffef4e5a34be80425cae3e81533f7f2953f95fca53a22057a39125f5c76350fba7fc6c036838fb951d0aa8702e7f44c6f8a9cbce3b64fa8ddc2bb8c8b35d1e29a21beda6fdd332b31a749321455277231fd9d70ea4aded95053b395f88fa6916d126e1626fc0f1be6cd2a9538d17c498b40927f12b3bb40fa3e272e82cd2242b670afefa387470f4e6e0a1236028954c9e90311f486617187956a23b90b356d71e219e6dd055c2120771003a6c12769aa3ceacb9642bc01022731ca7a413b68ee7d1d5444f75dfa51a68b74a01ac85f6ceaf5e56987b9d67d6de896f5aafd25c78c413a6d4b5b03d571167524cd231ba13bd9f80fd7413faf21e8170cef0d08b242c5c38a2b0158da56e358ba0692f670d4611c7a3624b234adc30c5b7198e0afc941f5d13eae3a94ddffa652c784c34c582e04e948da91a5ac3038a9df38fd4f1733779f4f122ca2d7ff9d03bac9def35d9ee3a183161f8f2808d472b2e64581209359cea58ca7757164c666029982223877e2b14d2d537afb012f1ffc12cd083c16dfc64213c56f3d4d22b603d3dfab1d21e239d6fc1f9f153ed61f1ac91c29c85c16f4aa2985f84052f5a08d32bddfd05ac00805d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee00000000000000010000000002faf080ab009f4d0b317a141e5b3f865599676f895834400b66dd09d33ad27163ca176f00061b1000028fe56ab181f454372c939ca0516f5782b26cec2010885c70e55c41a1e43de3af6635d2ed0bed90837cefa9f1805f4808e8092a4d44efe5fb616ff7678487a460b367134fcc728ba273fb1d22718bc6a95e47a120a6d952c7c2cb8f38e59c2a4efa63977cced7e4b8f46e4d47d29098a73beee807c3337c4acddcbb32b78eddbd124b2f33ec6cd8bdd364aa4ad2c10eb69dab808fe5f5f0aec19750e51ac65a8746f345c05d4b8823ffbeadd6200ad01449c39a008fbe117a8ee904445488811336d0c439419fa4f285f9f62a34f10b076c99c0092968e3cc9fa656016b6da049bd56b910d7a9356e76d24e746b280f0275ec9e9bace82d852bf0a137ea02d4cbd3b68450bfb593564d8c20953bb758890a55a8c381a4b3303b61ec26a56111361bf7262b3f6f2503aad06758130d86ea607cdbba53415aaf253430d92fdd81c685ab39233e94654e6508eec1347747e2df2862169382aef6f99dd78b50629c5d98b1fcc73e865679d862b42f8e9d54ef6288ed2c3f2713f0fa4db538cd3e70ec1a30cd65dbf873f581b30892acedacd39b5f0aa774d1f3f77d8fd11ed628bcd02ac33f89123595aa455ec54a07e93e26f94338fedd8bb84094a0add52f912ed5f9019e3a28d90d251cc6ed7ffd35254dcadd9f1e9b28eb0e06fd4fe961d60cb690a7757f475c08aef07c2e54668121540a42a9c779623709a2124629e8c4bd4021763979647f625b360a4559dfd3f57798dfe5d36e9d902904af3ed67d8f4b0894538c7718f5160d211cec27375a7e6a2ec42f2c8fcd1c953b7b8379d42439a2c6b921a66d5102ceb6bd6bc20b17098e69a0a4f708b42520e4792474c3d115a12c83ef60ac6e69d8842c5981e9a6d178efa352e73e4a34bed4fb590dbeecb259617668e6ffb9f955297f26e3a6a3b95d9617529a61f08666ca1069d2ee1876337d3e786244c5bb45a8236577184584cf3018118d7e4e78973ee510b6773bd922797e580cd240dea3ca31892d23c1e6e4fa92f1a01da8ea40044f5613a9429ebe7906f79b32636204d025115810b376d4c6436da136b96c7c10649e3290caecd6ca14d995a817e3725fee7e621c5366f80c752e50aeffee1af3361924f31cbb1cb44731d19963ff30127ca2363ce15e50948be14c43400737ee8910ed06027599da74b06e77eb82ac523cc031c57c02dd82dbc0d53629d072615c92034cf829e7a5d4437b1f58e2bd4b16993e1e1b05c26ed8d695351db11d21df36a7f5811ef5fe001ab1e1c6ce9d2b69b6ac3af8087e6666317f75b645e3b1caefac0eb65327fcb9fa62be341c99f191cc869e48dbc8fee3e42d4393cbc6505c880dd6739a69be4f7ef3de306480a7a51f413d310926f252ea96a0c772d8b8e94e7d6cedbfbdb21fae2ffc379eb17c2680fa2bc56a8726c93e7bf2d446221ce95e49da93d29bec8e53ddcfd262c33d556c2b8921c3de93236408b462d28612d3343fbb9cc538b1e6b33c341c3b91dd41f936931e61f146fd00aee1c5c0de97b47cf7efce889012e1c22dd8faf0fe155f4e9930c27941d8b0907502a835bfffff801f6835de69ad33e95232f773219eec0e2374c421230f323257dbc91629c4ca8a61584f737b827fe8e8f5b69b88a7b64b362f8142b043f08ea82c4a0ab7c4e0b9805533e806f90597095242ff64f314801fb7ad838e98e1859b2c05c9b027ae5a4baf780d15977bc1492dee9b14b1cb0fb3243eb2304919486fcde89a3cf35a64e31b1698e35fbb8528a73526a19189d406272b8becec94379f69372afa99d06bb4f34df72e1c3b49557855ae8ac265160bdf48ab34cde30d2665891cfeda24adcc657d851431f38953f917f1a111f023d2c71845ccf25a562d2450bf8b4986b64ae4fd09e5a8ab9610d11fd68e9d570b3a467780236de974c7fd05ac00805d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee000000000000000200000000003d0900559bb949364ed92a64f449cd6ee3eaba2e607595d3cecb36b06b145baaa69bc000061b100002860fd058656f185036e81a64fe19034d29223d3620bdf4bf2ff3c1def9c6bdd70c2cda7f660e1b202672741bc3258b04fb755fbbb1350261e7992bce930e256bd5d8d4fde61365b7b24904b788ef2040fdd6eb87f97c2d2f29eab4291d9a28b5da306f28b98d01d93517b203a028199d423a3545aa17522c63247f73af7b63335b0b48e4b875c69b42f4cb1573bb3e5fd68837f90c50b0161f067a9eafd9a0790e53ed5053ce60ffff410e4b16a4b7bc5a52c57e78ef266100c9f79753f81878c08e5dbd4d80c6e46a339578d8ac8c572df77ef614800cedc460c06878c0da97908067729ed35e3afe919071724f89ab736f5791a9c9b5d422136332213434c836e2ceb9fce0e2e96a9a6d7befe8c132867d5fafea1a7809ddd6b3a89c8ef6ea83028d3e2cca00f1bc6e12ea8b67e91a98acaa2edebaf6dd3a18c655b6b1fbbff5c641f8002780758d05f1f39c9470a124a5add314abd2262142733120747cda2f1d9eb90d68ecb9c7fbab23d73a35f2a20a2a365de6cd678d53bd5bd9bd518333d04e8e678b5d08f028982dad08c80be7d8fbb0638dd814232224c687f8321baf96ed8b39a1e9ab52dfd69d8eed79ac3f5a2c480a585bff038c92b367743317b937d969cdd533ae1d797a789ff7994f86a0d6cae470b64ebddbc478573af347a110dd1feaaeb4779441ec439cfdbafaba870105efd86b9d85a4df7ddb9b09f5b6b4144cd1fad5932df37ebf19a62648659fc1969142310a5cc9b4d0c48ba6bb0f863ed53a0b75fe1ee6515a46993f95be2e34166408b54a43e55c4802b37ac902fb4c8367ce38990d07ed3104d0728d327d3b9de6452b520f9af534505885788109ec78c1176ca0864d28422e826cc83f821b7eaf028d6a7e350b3037d0fe58d1d4e18113c8f61913932e71c0f334402534d8663f15445f900fb9dc6b3a93223868167be26fcbd70c0459eee37f81fd539c319eb0b04bd478b94b5f4cd23b4d496c2bdd6e8a154fd76c4ecbdf7647fe9e7be88c6a3a8e7696e2e596dfc25ba798db6ca331d135e9ce7c0aab9721d3f70ca53354f96ecd028236259b9b0d9e0bbf73c8e841b1d4276214f7be8feb525c91d39910b0e091997a2b89e945806e93cd325cb51463b0729f1a519334038cba09653799ef533a49e812e86b81af7e5099a02ca11c2b17dfc8b9e51a57a20546f2c92826676ebcb4f64fe7cc77424388dfec7199179cb125bb4613c8bf05edc4173987d7d5ae0fcbfa08a1e5ea2d6b01406d740b49c5b1a68da585549590c3ec13479efa3136c5ade68057fe173ace55593ceca8440372b03f332969866d1bfbce3fe9dd907d27593b8b2ad25eb4b12afd0f3abe7931ba7789c84a3ed65a03df06d998a9956043a4de786c359bdd58f0b9e5cfc32bc709b626ce8e63f3997a0e9f784f6b94e342b4710553e805cc8399191254189058ec75a15556467b2456d9b38a7e4d15cf59727ad2c32f0daaef1748be04311ff484479eb31f7eff9e32b816fa40f40430e801c15e931294b39ec4d6c93e8130fb4a1b53ca6471886a33b10b46d6973d02bbe3b39345e121473ea4ba41f3cfced07c3a613393e38b8ca01c353ccab96128093bb5fd000978b11ae6f7c1fedf48c3682119d1b44629d02ea3800d2e247ef1e78e527e5d574b4dd144e1fe1b0c6551442d419baba300258657792947443747b29b6fb9417d3c57536de6aa379c02f3addbd2066554189ca817c7f57331c972c30e3ed06fc7e521b8e2bb57c023dff9816f260a153f1ffd55df2a2fae568f3dc734d62ab47a77c54772b5e4cf2758c912cb473ec372173d9eda0c58b103ab12d11dcb976a40816ecfa8b9c9384f6415017555933652e77ae20e14ea9ac25b5811fc03364c4883bb78c82e29f8a8892415ff652b782642bf6036b3e2200e0000000000000004000000000000000300040000000000000000000319c0569a7b4f4021827771a963002b8b00000000000000010003d56d81344fe44d1f8f1a95850431563c00000000000000020003d33fd4c8d4ad4ce3880bf79a4856ca2100000000000000030003efcb10168b144c8bb4f694a3b98a129f000000000000000002000700fd05aa5d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee000000000000000200000000003d0900559bb949364ed92a64f449cd6ee3eaba2e607595d3cecb36b06b145baaa69bc000061b100002860fd058656f185036e81a64fe19034d29223d3620bdf4bf2ff3c1def9c6bdd70c2cda7f660e1b202672741bc3258b04fb755fbbb1350261e7992bce930e256bd5d8d4fde61365b7b24904b788ef2040fdd6eb87f97c2d2f29eab4291d9a28b5da306f28b98d01d93517b203a028199d423a3545aa17522c63247f73af7b63335b0b48e4b875c69b42f4cb1573bb3e5fd68837f90c50b0161f067a9eafd9a0790e53ed5053ce60ffff410e4b16a4b7bc5a52c57e78ef266100c9f79753f81878c08e5dbd4d80c6e46a339578d8ac8c572df77ef614800cedc460c06878c0da97908067729ed35e3afe919071724f89ab736f5791a9c9b5d422136332213434c836e2ceb9fce0e2e96a9a6d7befe8c132867d5fafea1a7809ddd6b3a89c8ef6ea83028d3e2cca00f1bc6e12ea8b67e91a98acaa2edebaf6dd3a18c655b6b1fbbff5c641f8002780758d05f1f39c9470a124a5add314abd2262142733120747cda2f1d9eb90d68ecb9c7fbab23d73a35f2a20a2a365de6cd678d53bd5bd9bd518333d04e8e678b5d08f028982dad08c80be7d8fbb0638dd814232224c687f8321baf96ed8b39a1e9ab52dfd69d8eed79ac3f5a2c480a585bff038c92b367743317b937d969cdd533ae1d797a789ff7994f86a0d6cae470b64ebddbc478573af347a110dd1feaaeb4779441ec439cfdbafaba870105efd86b9d85a4df7ddb9b09f5b6b4144cd1fad5932df37ebf19a62648659fc1969142310a5cc9b4d0c48ba6bb0f863ed53a0b75fe1ee6515a46993f95be2e34166408b54a43e55c4802b37ac902fb4c8367ce38990d07ed3104d0728d327d3b9de6452b520f9af534505885788109ec78c1176ca0864d28422e826cc83f821b7eaf028d6a7e350b3037d0fe58d1d4e18113c8f61913932e71c0f334402534d8663f15445f900fb9dc6b3a93223868167be26fcbd70c0459eee37f81fd539c319eb0b04bd478b94b5f4cd23b4d496c2bdd6e8a154fd76c4ecbdf7647fe9e7be88c6a3a8e7696e2e596dfc25ba798db6ca331d135e9ce7c0aab9721d3f70ca53354f96ecd028236259b9b0d9e0bbf73c8e841b1d4276214f7be8feb525c91d39910b0e091997a2b89e945806e93cd325cb51463b0729f1a519334038cba09653799ef533a49e812e86b81af7e5099a02ca11c2b17dfc8b9e51a57a20546f2c92826676ebcb4f64fe7cc77424388dfec7199179cb125bb4613c8bf05edc4173987d7d5ae0fcbfa08a1e5ea2d6b01406d740b49c5b1a68da585549590c3ec13479efa3136c5ade68057fe173ace55593ceca8440372b03f332969866d1bfbce3fe9dd907d27593b8b2ad25eb4b12afd0f3abe7931ba7789c84a3ed65a03df06d998a9956043a4de786c359bdd58f0b9e5cfc32bc709b626ce8e63f3997a0e9f784f6b94e342b4710553e805cc8399191254189058ec75a15556467b2456d9b38a7e4d15cf59727ad2c32f0daaef1748be04311ff484479eb31f7eff9e32b816fa40f40430e801c15e931294b39ec4d6c93e8130fb4a1b53ca6471886a33b10b46d6973d02bbe3b39345e121473ea4ba41f3cfced07c3a613393e38b8ca01c353ccab96128093bb5fd000978b11ae6f7c1fedf48c3682119d1b44629d02ea3800d2e247ef1e78e527e5d574b4dd144e1fe1b0c6551442d419baba300258657792947443747b29b6fb9417d3c57536de6aa379c02f3addbd2066554189ca817c7f57331c972c30e3ed06fc7e521b8e2bb57c023dff9816f260a153f1ffd55df2a2fae568f3dc734d62ab47a77c54772b5e4cf2758c912cb473ec372173d9eda0c58b103ab12d11dcb976a40816ecfa8b9c9384f6415017555933652e77ae20e14ea9ac25b5811fc03364c4883bb78c82e29f8a8892415ff652b782642bf6036b3e2200efffd05aa5d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee0000000000000003000000000007a120bf5899359b258acdec0ea500e437267aa6ba18e8509e15df74518f6ba7aa348f00061b1000036d768d1d63f1c9f09c252b5b48cf4d2db3f4935150c551391b37727723168982d7e58ce2a769313e461a0f3791a8c0208a769f5bdf4d57fbd0a9de104a0b1bbc1ab25ebbf87d1bc86dbbd42fd0dc0ff18a7ebfdd692c7dc3b95d095052540ce7801f3e25cbbcfd9dab857bc39624f59facbfacef5ab1e1e1f889b85f3b1f2a580cd660b73aa662fb15487722bd3c3f93d272725289136f2ee0fae4efe1afea25e6d4fc8334a47ad62d22be06605a15538dbd2a81311c4489b91d1cb143743e4570a6345c4f035c060aaf287ef66e7ebbe7b9037c10b66e087827478fdf76a02d25fe90e0f8228c1edfcb12eee3dd4e505a6c5a7bf2f5954ebb5560cd8c7f8b8f3f4ddca41a48a0d6c0e1092dcadc853752f459486bed349213cc15044585255842717ab70a3de3f0eedeecca10112c85a8bc248dc66c883a62288b49588d9fcc048c51081e94d65bd4731e7d71fba13693b82d2831d3bea370918aa5ddf1cc4f0d5015bb8dfb951ab13fbb9d26d5cb83dc980fc36f1712d616ce24d2c530253320f4f322f093a605ea426c577544f2983efc80be56791f443652c2233039a68f966c2f0b6351068616755dd2036b6226244d394a2b5b59160217603149901e8abe19a2bf404f384c2ed7fb0c5e470ee5ee8561f58f66bda729c2c8816853ad2357a009e537efcb4a28e845ca616be917b15aa6b8eb280bfcb321ea62fff21168b8ed54d58ccfdeee0e7752bfc0f02549d76615c85dd1e152a85ee931b34f436439e2233740328ba504c49f9764e1dca645ebf6a1377310ab53b68b4d0a6e6c952068249b86c29061725035db8d294ab9c56901485814735aa2a8d6987b1a19ced65a332f97751c4cd8a27093851f7775e5314078c04d254754d976bed2dbd2e6ecda62e9a0c7fd95299b4b13a54c9498d384210fb42d3b6bc5d8f0d42e42879f86c21eb7c5c6d1bffdd598b8f3cfcb75df159f1125a65f960637c62c7c5632d73b7b4b0544082008ede22d87e79e20eb08be0817650fefcd111de48ba2be02a7b080275c991a0ee4445dab89312644c7cf4101895e2dbcaad7d87e8e3b13e62751861b204a7e6f5a476eab0817c294d59aa0247903077d4cbe4a98e7984d2b04623d2b2ef4c650b43db15541ede229c12c045529b5c77993eb6acbdc28d812a486b5957fb996731980555bdd59ad824a882ebe1a77cbe6b9035f1c69dd01b2a27a47be5febfa65c721354e70071b07db4ebc2f01d143587c1b32a5337dd010d2a76a7773f4a7c665b4cfe4a61b103b1c319d85e007eb99b52400cd8776697e1d6118197655bf7bd0a5e7f4594bf36a2706128d5f5c3ee166b586c4d515611f4597a4c1088c1853a5959f73830cb973ea922d6211ee7d9b1d67b1025486f8f3c72a517d0d48d9a57d64c0f48e513c3b09e14ce91b515a87f3035ab55d241ccb12108dd299a362af26af96ada920202dfe26d456065717a85e6bbec540637059d82480f6c917a11434a9be5fee5ba33a8552b7b0e59f123991525e1dc14bfdfd109625b2df477bce565045375dacf6ffe99081914fc9f64df7ef8eb26801ce01be083555fd2f8a338a33c07f484b01a310ee420f5c932cfc5a8f6d32a20c3915a188833ac5775500c5d2b73e4ea595512e869f91f83de8e048c804ec8cd6de45b7ad264bcfb3c235325d3c09673a2a94e60736ceada065cefb1e355bd35bd4b56ae513343e85a3d840c2211da2d1941112318f97f825e1714f74fc2d33430196cca2423f43641b0d75b4b1a1a1ef0f07af31fda06220a2628aaab9f303cb4fe6d73fa9b39e8f6083af3bbca1becdd646afbd888c560bbf7cf4fcf5c02f712726eb23b03fe5c290df63a85ed1026cee07ab0d2bb868aa4dd6594252cb75ad5d11d9c53c5238047ea3d311c1443d478dd283a2602704fffd05aa5d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee000000000000000100000000007a1200ffb841fb291ecf09ae7b5dcec1feeb45ba196ca02d6b9e50ae2b3dcd9ca5d72500061b100003acd0a3acb9b4f9540678dc9324480bb3d4f54e5e007739c9c1d600bff75dfbbd0191e75c0a2d810a6ec5b03d02cffbf1a66123c87790e66eee8d416caf82e7ea7090a62fe14276fa88af32ab9793f7a100de5525eedf71967c13c8d361246d98b78cc74383e714f88899f34407644c14874046b3b722186015c07b8db042db955c91cb14abbf3cfa646aea81ad15bf67108a763539c64c5a8e8115d46e063e956671e8ea8d8fd638a6414d71e9b475ebe070da7faf75a898f29048ab5a2b6c7e3a72a178b8e470e8375f539ebf6284d15486c5a8774d46ea164ba2b62181f47623fd987ff5958550c962a193638679b79fcd477fdf2a09c0fa879bb22cb493fbaed27518f5cb265741535b4ab14246077ca18f11ece7aaa0e01ec5bf02c3c3b541ea08bf254df123079c1538e266dcd3161bf1b9ed41d873f1491906e1459ba51ac9dd95e783598d3c356e0cc5b98c2a96b148f55f102a9810181eedd46cd00b445d861baeeac46eba469435aa4ddc877bd68b53f4d005aa2566d356cc344aafcdc86abd774ea28cc838d2fdc541c4b6da494a96e128b8c2abab4b21b3ae2646cdcc3528ef6fd8587b3a0636ead67a62309fb003afdc14177d329b062622313e9dee912847763c68678df663a39b89c69efdb6d916d5754534bdca9030955cbcbae6fb7ff1df6282175cd37a30a904418b976af05809f0e0e7e4b4e2ec018f1e9c6bcbe7a7822c8699669946f5e684671d63e68cc7c9cca2963945dc21c52232e6f83b1875b2bed7c80c37371a480a2e5255d49d390c3b2adfc695036ed91371cda7d79bdfbae464581f0b32942f03826aca17ab9da6ade4a778d310ec3da17fc3af426d21b347aee7c2db7b5e188e35714dc514e3a1c100e8595c9e0e4399ad796021976f077e5733ea535cc6daec2e371853dcb715fc366ea7d6b9a5b3509dccf5c2e1225e3a51de9f5bb9b6586b282a0b27a9ae7ae8f2be14ec677670241e384b462eecfde68957839b1327c9e5c622c0f67cdaf3845ddbe6f754401d720d6b6d5c061dc906bfa70fb76e1168c6ac1a25cabe8873c3c1e540ae44ae631a2638accd7951f368442dba7b38d0662ccb0140d1e4ca23f51de731a6f5adcf816c3235359afd607e58948da29a5f06c96b4312aee7d35ed4c2c811a58c5a196ac2f377d653d51cfccb5213c928955ac880b5fb1b91e88a52d5c217cbf78e071275fe626c230fded548b0f1667af1309149ff74c5542119d4e269fdc1b241d9f53e02e38e015b7c5c2d2ee623bcb4167e37edafddc7fadd642c20f81b454db1a3b578d527f124dbd1f3d99fdd1590256ae4e47c2e8b3bfe8708a0d5506d6ce8b130ce6b70028161454a5065e9925d75c0095dc24ba789489fa1e9236e25330ca1a45e61224ee027664f6589028a240961aff09187fb719ff3477b56427189b7b3c790b4031f6539c5e3a8a5d7fd99c2534ed1646920a43e7315bba98d59c51b337ba7a1b038006bb574df46830f96a5685e07ee8a0a41e712810faacfb231c67e69d0fc24b98d782c70e15524d5d2dcf4e64b4e26772dfa7067f6dc7ffc8b06e6ef3ecb13f927d466e0cd3a7ea09aaed90b7810bbfdcd8a1274bbe78a453ffff11ccee62059ec25955b34a1a1cdf8a3e506d99dcbadf16032646117556ad71cd93ceeec42be0350a6c9f194fea783558c42a56d034dcaf6fb1b28037362c7c6e2446bcda71d0a88adda3144589447ef13cb85a4d2cd16ef444097bc03e32c3b1a055e952f7ac87078b04deb900375a16dbd382ea4375ddc0a9645deca620590337e803ea8b41337f3f4e4030119a2337424dbea3d21214063ce853843dd4e6df94e3dc3bbb36d89d9eb8e15e52d0699bc6ad1de9d12afc95c8785d63756576d357126e13b25502d542774f6e5d2fdb559d52698d08600fd05aa5d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee00000000000000010000000002faf080ab009f4d0b317a141e5b3f865599676f895834400b66dd09d33ad27163ca176f00061b1000028fe56ab181f454372c939ca0516f5782b26cec2010885c70e55c41a1e43de3af6635d2ed0bed90837cefa9f1805f4808e8092a4d44efe5fb616ff7678487a460b367134fcc728ba273fb1d22718bc6a95e47a120a6d952c7c2cb8f38e59c2a4efa63977cced7e4b8f46e4d47d29098a73beee807c3337c4acddcbb32b78eddbd124b2f33ec6cd8bdd364aa4ad2c10eb69dab808fe5f5f0aec19750e51ac65a8746f345c05d4b8823ffbeadd6200ad01449c39a008fbe117a8ee904445488811336d0c439419fa4f285f9f62a34f10b076c99c0092968e3cc9fa656016b6da049bd56b910d7a9356e76d24e746b280f0275ec9e9bace82d852bf0a137ea02d4cbd3b68450bfb593564d8c20953bb758890a55a8c381a4b3303b61ec26a56111361bf7262b3f6f2503aad06758130d86ea607cdbba53415aaf253430d92fdd81c685ab39233e94654e6508eec1347747e2df2862169382aef6f99dd78b50629c5d98b1fcc73e865679d862b42f8e9d54ef6288ed2c3f2713f0fa4db538cd3e70ec1a30cd65dbf873f581b30892acedacd39b5f0aa774d1f3f77d8fd11ed628bcd02ac33f89123595aa455ec54a07e93e26f94338fedd8bb84094a0add52f912ed5f9019e3a28d90d251cc6ed7ffd35254dcadd9f1e9b28eb0e06fd4fe961d60cb690a7757f475c08aef07c2e54668121540a42a9c779623709a2124629e8c4bd4021763979647f625b360a4559dfd3f57798dfe5d36e9d902904af3ed67d8f4b0894538c7718f5160d211cec27375a7e6a2ec42f2c8fcd1c953b7b8379d42439a2c6b921a66d5102ceb6bd6bc20b17098e69a0a4f708b42520e4792474c3d115a12c83ef60ac6e69d8842c5981e9a6d178efa352e73e4a34bed4fb590dbeecb259617668e6ffb9f955297f26e3a6a3b95d9617529a61f08666ca1069d2ee1876337d3e786244c5bb45a8236577184584cf3018118d7e4e78973ee510b6773bd922797e580cd240dea3ca31892d23c1e6e4fa92f1a01da8ea40044f5613a9429ebe7906f79b32636204d025115810b376d4c6436da136b96c7c10649e3290caecd6ca14d995a817e3725fee7e621c5366f80c752e50aeffee1af3361924f31cbb1cb44731d19963ff30127ca2363ce15e50948be14c43400737ee8910ed06027599da74b06e77eb82ac523cc031c57c02dd82dbc0d53629d072615c92034cf829e7a5d4437b1f58e2bd4b16993e1e1b05c26ed8d695351db11d21df36a7f5811ef5fe001ab1e1c6ce9d2b69b6ac3af8087e6666317f75b645e3b1caefac0eb65327fcb9fa62be341c99f191cc869e48dbc8fee3e42d4393cbc6505c880dd6739a69be4f7ef3de306480a7a51f413d310926f252ea96a0c772d8b8e94e7d6cedbfbdb21fae2ffc379eb17c2680fa2bc56a8726c93e7bf2d446221ce95e49da93d29bec8e53ddcfd262c33d556c2b8921c3de93236408b462d28612d3343fbb9cc538b1e6b33c341c3b91dd41f936931e61f146fd00aee1c5c0de97b47cf7efce889012e1c22dd8faf0fe155f4e9930c27941d8b0907502a835bfffff801f6835de69ad33e95232f773219eec0e2374c421230f323257dbc91629c4ca8a61584f737b827fe8e8f5b69b88a7b64b362f8142b043f08ea82c4a0ab7c4e0b9805533e806f90597095242ff64f314801fb7ad838e98e1859b2c05c9b027ae5a4baf780d15977bc1492dee9b14b1cb0fb3243eb2304919486fcde89a3cf35a64e31b1698e35fbb8528a73526a19189d406272b8becec94379f69372afa99d06bb4f34df72e1c3b49557855ae8ac265160bdf48ab34cde30d2665891cfeda24adcc657d851431f38953f917f1a111f023d2c71845ccf25a562d2450bf8b4986b64ae4fd09e5a8ab9610d11fd68e9d570b3a467780236de974c7fffd05aa5d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee000000000000000200000000000f4240657c0bd97e795218aa623b27cf9a71764379c4762fcee8993aa0b1ab1e32194a00061b100002c0ec5d388a8c78491bbd870faa2c46e4282e11796123b69c2792e5806748ef068397f0212a33e3f79162ba4ea247ccec410db039dd323af48ac27bd0ba77ecb870c587477d4543d9a29c53fc02bc98d7cd0144c7abf80b999c22b42a28ae8d625478ca304001f9a49782ec970031e673c76e4e27357a321729d6df38d1d88dcbf764c69eda3baac9739bed637010f44638cfe1deecc56b76f6e02d1d0c3f104462b9ffa5f20de4cf092d86a5bb35d5f62b0fb1c983a2c06df17c9ffc809c83e4b4335f5903fab536fbd9719847bb063541ecbe05c12ef8d058b3547faca054e3d662250f1cc1f925dd71297abc25fe37ab33a086759fac76208a64552f84d2e4d84daccdc3aa2bbd2c2f922bf262596742dfe034529d1ead2975dd3d197ab0e2e1c75c8b8f160ca6077638022d4afbd107979949cf342cb399347f3990029f0db6d9ac0c569d61d42539371f9a7ff59e9c83ff97d15bf0eeb254ae58fb7b1f9d8710c546ac8a227930c66ac841bc4f475229e5cadd14ba5a01e6b2da99c55861a08e2100e62c4499d30003fe30ddaa347d7a27c2158d3787d58fe51ae57d797bbef7f900508d1580df3e5233f0887567fba1faa918c246d2ec5c3b7aa022cb8a652d00b4d719e312482f57655eee80a90cdc73151fd7ab9c5367793d60c6088fab98f0547d7f547e10db202a25e027a5cd0abc41bb0e3ef563c0a6d469a702b2a26f0e8b4fddb845a16a5f06b9dee33c3adb31430c94942c5023179d3e4441948a332069a1c3b69dca65f05a43452e42fd28a2f7e6344f98ab9a7e4eece3c1709be1f7bb620f8b6c45989a8bccad39a4bf40e8215183d1449196f1f9fc17de778b616856152e6e6145a1b7a3d7f226becaea5ebe34aa4bd06e60f0fed207bfd21f5663bfadd37dd722437bcd46a26fb4e19d062574a81bcd817eecbc1914a5878809128961acdd73113ae9c51070ff4494e16d81ccec777eeb513da82bf43d4884812b26546b4370dc315793271b069f60f4285f648cf122ed8b22b0c7a27e94ccd59a273eb774c109e19980e146850de95f82cdd8aa0e82022672024c917b281422d284df0ee0bdeb3d4ac56b4ca675ebdb835c17b6a822d79ae7310f4aa41d80ac61c5e45c1c0e1d64542622a31091a9f87c335e86d964dd85a951d7c9bf41c9f2b1a9bb8424d7d1b26413da8034182fa42d2b1cd1f8745482c49d8348d19c72cf5a02bd28e4cba82128af8bf5d9c1215c4f543ef4d185f100f8d803dfa29c300c072e44ad9542b82fb1380d55c15c9a4b4398876e2450b90b49990746f339abca8cc8a462b62329a128758ce0e46b5f998af1bb485a3044bd125424eb5c623afd2a11befe4ec544eafe275ed1ad82b940dad5e9a9710d48562e51b296ba81f2d70593685ba0e3f3b25089a187e61d5675dd481aa99620276cb0a841a3c4df201a929287b1127270c5d25d06fb286dae1a9a5a5cdb60003f0c30d2021074bf252e550685f7b51a087a77b0871e883104e55f898aa5bc4cf8538c293253a737556d7f220e15b90cf0eda7d5f2172372e3c50c12cc588f312da37191b5038e944825044b130bff281ecd47a4252a1411ab7a9305c2b37e9facd435e9c434de37641498f8e4bfa7b42966da29c84200aca87ea1c3b00db54906b340e524a7dc4a15403bb82bc24517cb91026096bdf18f5f7ae5640ed6de1f0c5d184813d6b9d244b32b58e9ff524741a39383eec3a530d60db13deb26e3523a725f0599b671b625c07002704fb600b77318417d2527537359d122e22a1f7581eaebdc19e65ba50bdda18ae08e9a8694fcb0ff1a2cd98d910dbcd52064c15a4282d67b278c72a0fdbf228abf6b519dd28ac21c57d1da4bb7ad5b5ab10da6b83132df1da79ccfc77fb45598bbd91ef5ab96d8a2ee148639a562debafffd05aa5d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee00000000000000000000000002faf08011b29e60a38883a8d4434f17ca3d92161109f7ddd8799e64e86d6b8509babd1100061b100003b8c1771721551fa88af8fdde92909add6e5b8fa90a4b0484ee065ed3ed7c56e733a7fcd775d4ab92956c1328ffee9c195004c5dee5dd5b9d0f9034589e6769e72579d3d5837ad70785ec420b4a24c04d36668728c0d2534ff1feea9aac2410423fd79c7db9231ee7efd3d585646e378fe53d731d18f38d6356a970f5c3026edc849d49ff34e58dfb7548512461110088ac3aa800e10785029ba3b0e9ab7bde0f056939e4921792dba2f5c005135daf57e32cae06a9ccb1b4d321f3ba015e5b92def1ff1c200e56b3990d82570586bfae26e9398e17dc6c069f92d80e6dfedf6b2f24b1dc3cc9d63e684d861f40fdbf508d4ac34b7f10c57be2a9b0c5921f86869c29ada5394b8780d2488a4fca3cd98ddb0ff8ea4415a07caea436682835744e94d5cff6d3024a9525dbd697e499b7ef23062b18b225bfaa4c5bb07166f34ff7866ec8f0fbbc12f695c609692798364fa20bf7977e321deda3fe5510833494532fba94fc1f0dd14ec74f3e9fe8ee659634621b63d16d46a8958132c24bd82c516bdf9ae9515cebae42778e4de6be7047c31cf86c0df0306f7b6562e1f35be51e5e64cc6d9d4c010849e6ac7ddacaa4b7b6fb1d35aac815964090940e73a1193eece11c1c1d37e373ef58c5e2d690b6ed6338360af9906146da9db8329bd2786bbf92df10445ee093f0b1b2a640cc2daf003fa7141435ba1dd54f9cdbf5417fa7f539b255452852a85d2ce97ce5abed4980e7b409e283f97ccc9c01e104b55155f96ace6789f61c4661962d34fc5d7e6f5f5233180933b2fa7f7a5b074714645489f5221966160946b7bfbf0fe6733e6beb8af4457b9d36cde1200811009ec483a9d730ca980aa28f636942af5e89794a8edbc1b75d555ba134974374d0fe23d31c26566064eb9998d649bb2bf066bf710da50672f4e3ab4df843a0c8942bad0a071c237d4c1759eca37380919e36aec73284db202a32d3d1619f3e5b757b2df8b04bde567783dc8e465d996799782f1a1b8de9331681a35aa04edb427de87264c8ae9c397f29d3e8730db91256425a10b960a9de1a48d0d4186d617d2b69c87e2540f6570faff4ee1f6303d7d281434947abeaad83c86a4d25bef4de2bb3c6104aa0ceed7c8df039f4be6a42851a118adb1b8f98e02f6727b75d98541bab2ff24fb2f20342e86150c678941825409b62a844f44ca1ccdf0d9f7c2cf9b222fbed00bc92be0802fbfbbeefa71c8976cba8fc4aeb031480f434027b1cd593d08cbc14c2a360b736b06b5afb8da35f0be3818fff4275b8c830f5248a8b8edea1327454e1360bd90d4fa08e965f459b0b027e1180290cf762f813a31e8109f472d9657b03af737d1f7bd2e59441541a84ba818f1413c5cd1f8b9882e9188e0def9e44e2f4a7c710c893c7188ba86423f8ae86068d84e1832af548289e87c34d68b186df7e24ca5b051f8f5e4a44e2e7383ba2a09615b4147b34e86486731290ea67f3be24c13a9c5cc37f06555989b3f10c580a9cd2b416d0ee4210855c6833a25996761dfabb036f3893cff7db7e310baa8faa79f46e0ee43bf4dfd732eae7f44bad2e7c032b9c6d14947af6b0e37e5ec98372a622f716ffba0cde04b9d4508392dd154ddc34829412bfa604d4f00e4b10a553587343ef5c0944165e7ee1e34387b09c147ecba943cf36dbc4269efe50ec3a5a3075c43be9651d6db6acb9f657476952b78c990557f05935247a71077373ec436ec586def177448f8859ba096b7a838e5b4ce7a463f9082f705c26d99936eb1be584ea9b58a44b9b4faa07fd8247fa66cf4529d1b8cdb92ed7bd96bf0968db4376489c7d46f0f27d58ac884c29736502953723ef1ab41e19c7041d3e0e9091d7de2e3904d032de02292edb1225a672ab438d3c65f7921c06a9f181f8ffda4ac524d0e000fd05aa5d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee000000000000000000000000000493e0f81fd474bea478df0202b311c69e85dc6215f629491dd15ad0929faae2535abb00061b10000370b2714d2734e6b8cde085794dd7b41c8a9b6c03c1edd8e3db168ee7fce39493596e882b18b5b1b79c16400c6762b9856075821be6be9fab8f469f56820d8f341554400a8da7f1f1a8501902581d43b9fa6e5c68015716f718a2190b87fce41bf1b509aa61806394a42489d63c457fe4c79e7480eced1315edd731887e57704fc9102f50cb7f0d242d755cfd5a2172dbaf7f01b124861cc6d1dc804796bbb84165c805f0c0f3fb9ec97b74c2a694de56a9cf8d79d1a679260ee1169d78214b34c8a654ba22e59ddcd32beff4713de33549f035b342660405b0159a7a508e5691ef4805689140e72b8a0ef2e61be74dea5d0b8f5589e0e373cac2e2e1cc39b2121c05cf4122ad0f8b9af6fbf1de2ea26376c2650ccd306c13a7b64acbf2a3feed128754abe44658009e642768ae3d84f5e0fa5f7f360c2a1c76d26985817ae77b71fb59014a5483ebba9271cafa5e5d8031c569adeceb8bae6444e98d2522b28f6682109fc7d31cdb83ebd45e5d81e7f046df42345b49f470dbef9ed87709301d2c6131215d33a30b8d18e63e54a2aff85dd57672f8198bca6a67ee147c7d0ae649e5661ab6bf78a662fef9a164f1e332b9f16e6fb3d5769ddcbc1d1c07338d3394b9245d17618c2474e86c064fca4df00ad3a93dc051fd8c3328cde2a987798b0f22a21c90426700abeb1e6f38dffb485b5477ec44c690fa80e317b32a982fd3082253bba8595783290dbffee4fc9296ffdf16a8bf3154971bb720e78674969e9db2e0fbab9e9e13f24bc8b3af5e2f00f262f0da56de443f70398ab68f747d35370fcd8e1c0e130f7269e08f862b5a67f2c129be254df2358762ce3a947eb27d66450af51540e7721b47c8a5a86098ea64dad381f14e07aabbbc470949a99c07612add3ab4c575fe2e520bbe511a1a674aea37a44535c13ee3380f8f39bd230fc1481cd31912af36c6751e23c6f383cd37a8b13fa7df9f0c7e460739f2c6226638ee14f14d36366211cbc6a1e16b4856bf302a540aa9d9e833b1d59c510473096384c8b450f2f3f1dab9e614af822949d5cc93d76bc4d1a52891bc85f1981ef83161195ab7d8181ee4fb163bc6c685a10e87c7f4b15ed7d05833c230a4a5b63841fc65b959f0ff010e697f47c583f9b7fa9b389c0eff6614e47d85b83c483136f182be4c151d272f5d938b912a95e47d333e5de6a409ad271679a778a7eb3f169c71525302fac5d4575e2645c09763c2ef165736a7a726ca605038e2781404328790ffaacef2b9c2bf90122042cd571287bc4e3973da65fbd4e3da9e40e4347ca6eb4ef1ffef4e5a34be80425cae3e81533f7f2953f95fca53a22057a39125f5c76350fba7fc6c036838fb951d0aa8702e7f44c6f8a9cbce3b64fa8ddc2bb8c8b35d1e29a21beda6fdd332b31a749321455277231fd9d70ea4aded95053b395f88fa6916d126e1626fc0f1be6cd2a9538d17c498b40927f12b3bb40fa3e272e82cd2242b670afefa387470f4e6e0a1236028954c9e90311f486617187956a23b90b356d71e219e6dd055c2120771003a6c12769aa3ceacb9642bc01022731ca7a413b68ee7d1d5444f75dfa51a68b74a01ac85f6ceaf5e56987b9d67d6de896f5aafd25c78c413a6d4b5b03d571167524cd231ba13bd9f80fd7413faf21e8170cef0d08b242c5c38a2b0158da56e358ba0692f670d4611c7a3624b234adc30c5b7198e0afc941f5d13eae3a94ddffa652c784c34c582e04e948da91a5ac3038a9df38fd4f1733779f4f122ca2d7ff9d03bac9def35d9ee3a183161f8f2808d472b2e64581209359cea58ca7757164c666029982223877e2b14d2d537afb012f1ffc12cd083c16dfc64213c56f3d4d22b603d3dfab1d21e239d6fc1f9f153ed61f1ac91c29c85c16f4aa2985f84052f5a08d32bdd000027100000000008af34a0000000002c2322200183cab01341b3b937dc48c2d5d70e119b4fd5b4dc6d85e0bb49e98f1fe4ed87027bb80c7d8cec36237511da378ad5c121861660506bdf411240139e49a93e13aee25d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee270248e28af5950cd59a64545f84957e4cd869de45b4fb50b85313894a1567c134666207e5bec5803b71d6fd6a9cfea3e6ea9a8dfe645a7f4dc7c9cd6c4ce15a0002547bca65416a28af342589b5b771ce54464b17b2153b49a1d34a2ed0b0788ec37083e54750e6f368b4a40d18a8730522e8f23901ac856b697dbd91992d75e097e3f175514453a79521d93ca8b3ffed47cbe300afdd75d1dd23cbe0c14cf67b3856fbe2128b9b7543625f1da313516f7e441255f85e341371fb7f33c6833abf02000000000000000100245d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee000000002b40420f0000000000220020c57347ca54a9e6f279f6a1f1e50f19b48289c3baccdd356fb03033ae7ccb6e444752210252a01d9d8b03db1a99b1a82223f7dd60ecffa69dbef47c06228fdea2fe0f0215210322a747c1d7f77fc7577a689618bbeadf28b941412404ac5e216d684a32d57a8e52ae000100400000ffffffffffff0020cd6d4a4bf51a8c36a25cde5bc08188c5ae037fd9ad9e92b400bb3d10e473b55480007fffffffffff805d10939a524d7b2ab225cdb41decfc129208c372d51ca1db705bb1b9831e53ee061a8000002a00000000883a86353a00c855b5caa13998033c04330f88b88e084b3c00f228299e5554f0b66e9d5c630e194cd572acaee6e5124b612583b9722ccf24581716292785c4925c06226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f061a8000002a000060535ae20101009000000000000003e8000854d00000000a000000003b9aca000000" - val dataWaitForFundingConfirmed = hex"01002000000001039dc0e0b1d25905e44fdf6f8e89755a5e219685840d0bc1d28d3308f9628a3585000967c455a833a6f008c44e812a823c885366375989326c0ea49bb8d09c4ebd1e2c8000000000000000000003e8ffffffffffffffff0000000000004e2000000000000003e80090001e00160014f2c1f8aafa8640b0c0f956f06d03345911fa48f600000003028a8203af0ed6052cf28d670665549bc86f4b721c9fdb309d40c58f5811f63966e005d0000000000000044c0000000008f0d180000000000000271000000000000000000090006402f3244dc6ef79947a85330d51267925a23c291045abe050f425987ef5fcd2c44602c0908a5f652ce9ea80474427392f63b100608fadf4d88b80ca3b3a523ea14b21036012a17d10bebf5efa7da52fd794641d6cc605561f670aa6af7df55676a53809033a13125fc72f17e257f3c5275c4e6639c3a0829d304ecf53f751e289d02db008024882597bf6360b6b977b54b7a352ec260ac0078a17a94b453fcf2c0b4c74c29e0000186b0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028a82000000000000000000000000002710000000000bebc200000000002faf080024fe3aad7e575f558a4c29f2b81eb29f714ad42ee900c29ba8cdd7cf15e2567395000000002b40420f00000000002200202267351a35ae5073ea116aa05994c46cf2e01fb439380592518b03118ffde13747522102a3ba089e05c0d0cee8e90299e75c9908ca9f435f989ffdea26c208e6d745a7072102f3244dc6ef79947a85330d51267925a23c291045abe050f425987ef5fcd2c44652aefd015a02000000000101fe3aad7e575f558a4c29f2b81eb29f714ad42ee900c29ba8cdd7cf15e256739500000000001fa63c8002400d030000000000220020745b5a9e4b754f1667cb207b4afbfbd4713d191eb7cdb8abbf43ade59d247a4fb8180c00000000001600148e64399bd249c32f61fe6b7faaf81348e5ff82640400483045022100adb344fe13d3fc60b67d7d1ed8c8c8d4cf25214428deb8e421ac0453c153169c022025d4ed4f1c0b15de5d862478dc57ae8e3a301503e1a8d491cbba4726688eda5f01473044022048d5c4de2db5674107386eb499374a7184a493d2102998b4dfba2a4e1308ef1c022060b751f522600681d939c840c89da6a856c71353d9716bcd869148ff53a5caeb0147522102a3ba089e05c0d0cee8e90299e75c9908ca9f435f989ffdea26c208e6d745a7072102f3244dc6ef79947a85330d51267925a23c291045abe050f425987ef5fcd2c44652aed5f2bd2000000000000000000000000000002710000000002faf0800000000000bebc20079eb45fef7b8c8d1de96e25b675af76d513fcd522e19004eb0fea7a522bed6e7029415176453cf3e9a56ed7c1057d06c05c1127b54ce6520ed30cc35b9716ae66c000000000000000000000000000000000000000000000000000000000000ff0376bfdc6c3df837471e8ddff90fdb5e3690628179e0b25223c750824c649a9baa24fe3aad7e575f558a4c29f2b81eb29f714ad42ee900c29ba8cdd7cf15e2567395000000002b40420f00000000002200202267351a35ae5073ea116aa05994c46cf2e01fb439380592518b03118ffde13747522102a3ba089e05c0d0cee8e90299e75c9908ca9f435f989ffdea26c208e6d745a7072102f3244dc6ef79947a85330d51267925a23c291045abe050f425987ef5fcd2c44652ae000000fe3aad7e575f558a4c29f2b81eb29f714ad42ee900c29ba8cdd7cf15e2567395000000000000061a8000ff60fe3aad7e575f558a4c29f2b81eb29f714ad42ee900c29ba8cdd7cf15e256739537e8811edcf85b8dfa3c248aaac5f254c69425670bd46c3adced6ced6794452f2032301da9dee126d7929951721d05755a4da9a31ae1643a1fa9a28d377dbd9f" + val dataWaitForFundingConfirmed = hex"0100200000000103af0ed6052cf28d670665549bc86f4b721c9fdb309d40c58f5811f63966e005d000094083ad48a454dc5e607c1e5d2591338c4e34ec5af5c31a2e33d3a22e7ed94ad080000001000000000000044c0000000008f0d1800000000000002710000000000000000000900064ff160014208e15ba2108797d7d18b1711ade2bd5aaed0f470000186b0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028a82039dc0e0b1d25905e44fdf6f8e89755a5e219685840d0bc1d28d3308f9628a358500000000000003e8ffffffffffffffff0000000000004e2000000000000003e80090001e027bea4d02aefb98936d4d01a257fd3a98876d072bc46f0e4a168914de0a31d50d030dc932af8995a73c2a4b9266e2a81d562abac61a9d164f611261a087c9cf9cae02f21e4fed9c5e492e3a11cbf1921b816bc459e4b22bea94d215aa7530041b50e002aa0a7dbb9f730266b3f11d02f9c18553f0cfa245b7c8833701a9c4393abaf12603d52a694312d3b8aa68c6cfe607fd80685dde32d753c4cc25f0c4e3c4244b988800000003028a82000000000000000000000000002710000000002faf0800000000000bebc2002462cce806e70ebc4135574d196ef37c95ddd5d361833b4a950f233ec9bb7dd8dc000000002b40420f00000000002200207a8dd41cecf77356d7af608c10789f04f613b3edb079781111224b9a18138245475221027bea4d02aefb98936d4d01a257fd3a98876d072bc46f0e4a168914de0a31d50d21030b22c9cb71700ccc4bfbaf489c1fb7d3b276ed961cbe3afbb6058251ee89f56752aefd01590200000000010162cce806e70ebc4135574d196ef37c95ddd5d361833b4a950f233ec9bb7dd8dc0000000000bd40fe8002400d030000000000160014166c63052cb6a6756dd8274cf00b353ede684a74b8180c0000000000220020cc58790fd3c71f7d06df4b2d495737c1b066c6f995646309d23a04fca1d4440d040047304402203e06e51907a0f064a7e93706a8b1800a912bac7d5e526807352a78ca6ee123ee02205f9246645b638de1d3e8072e3bd73c5c7a06783120437bc6950d8b13ee0929b20147304402202934216692b1ece972969823d0900844f0dad3753a6b9c2023b5c92ae7561ae30220519e1669e44cd25a6a61a7332cb354fe400c9b32c838875717827431abb9bffe01475221027bea4d02aefb98936d4d01a257fd3a98876d072bc46f0e4a168914de0a31d50d21030b22c9cb71700ccc4bfbaf489c1fb7d3b276ed961cbe3afbb6058251ee89f56752ae364f712000000000000000000000000000002710000000000bebc200000000002faf0800cb2d59de649710ee85768a56bc16fa35f6e92d1046a5dc15a2538891cc13e79102f629dfcce594404ee14bed2642ee2b32c56e9caeda34604c8f3026bf6cde6fef000000000000000000000000000000000000000000000000000000000000ff028004eb06e51aa0c25332815422138e289366488590c30c2d36a8d475fe178f752462cce806e70ebc4135574d196ef37c95ddd5d361833b4a950f233ec9bb7dd8dc000000002b40420f00000000002200207a8dd41cecf77356d7af608c10789f04f613b3edb079781111224b9a18138245475221027bea4d02aefb98936d4d01a257fd3a98876d072bc46f0e4a168914de0a31d50d21030b22c9cb71700ccc4bfbaf489c1fb7d3b276ed961cbe3afbb6058251ee89f56752ae00000062cce806e70ebc4135574d196ef37c95ddd5d361833b4a950f233ec9bb7dd8dcff5e020000000101010101010101010101010101010101010101010101010101010101010101012a00000000ffffffff0140420f00000000002200207a8dd41cecf77356d7af608c10789f04f613b3edb079781111224b9a181382450000000000000000629db8f3000082000000000000000000000000000000000000000000000000000000000000000062cce806e70ebc4135574d196ef37c95ddd5d361833b4a950f233ec9bb7dd8dc000034577c7e4b037b38f635ffdc91509a0b378d964a01cd64f7b3471fea1fcf220f5ed28c1cfc118f32c017c6bf03cd8e15c2df20c7c7789603524827019a227fb6" val dataShutdown = hex"0100230000000103af0ed6052cf28d670665549bc86f4b721c9fdb309d40c58f5811f63966e005d000090cc78408b6ea14d14bab8c89a4e1e0cbdc4cb4645f9c3a6457b0bed5788c389a80000001000000000000044c0000000008f0d1800000000000002710000000000000000000900064ff1600146663df19ca3fcc1c04447b18d2cd795c485f19410000186b0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028a82039dc0e0b1d25905e44fdf6f8e89755a5e219685840d0bc1d28d3308f9628a358500000000000003e8ffffffffffffffff0000000000004e2000000000000003e80090001e0386998d8c3ecc235c80eb4605ec24c5192d27ddef57d204227d3ac0c54547312c02c02cf88a39307d6e9aa4ba00bda029ab3cd426316eb63c186875c3a5d80969500381d707ac8494a96e1e8b8bf4a3a703a78358c69856f4741dda173d9f9448219303d6ba71bae191ee8d282e57d3a7793919d621b9e2df77dcafe45a5cdb913784f80203212eea182f9f5d5666a54b3e96a7525a48d5b9ee0f9a160d13926480cb9fbe00000003028a82000000000000000001000200fd05aa9eb27b82a5de32ca44c8d8e38e705c62f5f4d3b945dfb5f03973dae05fa4388500000000000000000000000011e1a3000a00cedece5db1cf150c39b679dd048140f491a72e93196f9e205841a23791c500061b100003f2b3c9277a3dd9ee0fd08afce183d75f570299155a8dc5c1c5acc79a572629c37ee817bee5023531eb3929c8e95025deb4600cb6ccb900176a23ed7cc35f99f7266ec8b0e59f8e0c0150916c2533133bfd105e883ed7b33915f7a532e36d46db78a2842d7e99f1f8abc863a5f6f8866b130025610795266d8a9603a8ae11ee23ca765f9a82ef00686612da9f70c2b2c2ba242bcaa9e3d95e542cbe59461a75e5a8f01553da2552d363593b8a85bc546f17f8e8bdd1449602fe3f46ed566e42a4155cf0b6c26df2cc5a8312ebebaa6bf11df9a55aaad2a96cdf41d7e70e815b7457c9332cc58ae9de3b9f52da71e7f328afa8de7777c76ea82e17e4a2cb46c3669ccc5f644414764019bcb2d4069c3e7a29814f0462abe479804d4dcceb498f1da52d5796f69f7d1d235e2da967e8683f77e7f206034ab12c02aba8554ece3444f8e0803df9ba5a9b1b918f13d94fd89235e1e2ec32df3154b204bb7642d33112ce70ef5384b11cf07bcace83a97339e1f9fb33e4b2cf1ccd62cb5311ab2124a8ed33a6c95c49ec90d9a477f3556d098a39235e8f1b904ed7aec0052deb3173f5d85126bf90271c567f3e9a10c12bc50f37f41ae40b49c71cf74cf18cb6e5eac206cc596349503f913178dcb3ee4ec5410b30474a4a2831b18ac07cb78fc143e056aee802aaa8bfd5d97e403e718069b221e3effcd57accfd13bb61d4eb78e98f269e79062c414a9e0b39075d8baf371c0fe09aaed436445d62664de1a96e8c974a3fe0cc045dab3064c7601dda9213d89b8fe30437f0b5cffa296bce9c141e3c012502431ff0cd5cde95eb52f9dc78ce3fca95b6a75de178ed13f9e3e7610cdbd1a1a893dd635e07459aae22a8f8c5bfc0a33a1f88fdcc1b99173080b602f91f1c9549b235e21bfc4ca071e0070f0057d65d98343cd82035970f6d75fc9a4b191270d83cb0dc6aa84238567e230bb68d16b0bba3563a28d151b308a74766eac50d4b4b287e1f46230ed1c4e8259cefdbba86c367392097909a740f692b745bb8c4809115ddd42de543dac65245faa6870f25aa2df16118d6bee2be181789ab64e5ba727048eeda81e6a90995c681924b2f807554401b6aef9436a345253be21747c313e8d9e2bf048d890350c055016cc61a06dc082a2b2c1b038405248ce18bd5037afa0e04b704198d6129da78ef9b97a8cee66a1104acd89c2bb2ab57d519f6693fd94fbabbca63fb9bd29decd9dacb34000f0f40af6969577f37a9aa38b4f2cb3d5d974a3d53440e78aa7ba013ac9a242be930e819ec36a96850cd7c630ea102fab614f81a4c9b9a01e60aaf9956a4f109cf5496ac8a43d03b0802303a6fe515199f9dfd4e66c2eac124d4653e999702832073f75ebc177fffc3efd404141927b3635980a40ee6ae50ff14010ad8e21493a38e4930a82b9d636d7115a55511bf4296d80ea8105a07f65730db9315a084600be9a3dd2b19943fa7cc85d2293de47f7799459288caa8d40c55605b5abfdfbf1325d0ea90aba749b0a625847f4b006ff34b6c9bd14a1c107c8a0175983ad10ae47a285b7d503e870625711fe3e1557377433ee845e2254c538304a97850e5acd2d4ba14241630b026230ed508b84f9442d6fb9a45369e2cbbd0d494cfa2573d4a0e553c0013ecb33d44f2395e4e4a3f752b8f86955061eecf4a9f9fed27648446369a8dcae2e6ae0b51b9a4fe315ad5c7521764738cb591734b32a8e35c1d6c80d9202aacdbf65cc243ba0640f8f8c23d637d7331c5b9f4c44fa5f2858cf2d74937beb4b345d22c2614bb6346f38933f84aea2bd5456505709fd8b5335fbe54e99c351e151f1f209dcac9e37742d3978c9a95eed0b29fc0b4150229a0990f465bd3bbcf97f73237961042359aaa0f11b1bc4c572de165a6372f3f438e7071a19700fd05aa9eb27b82a5de32ca44c8d8e38e705c62f5f4d3b945dfb5f03973dae05fa438850000000000000001000000000bebc200a043ffa6f358e330873add2e0d4f05a72150cc831bb2f1062e5c378b9bced8e800061b1000025eacbc7939a2307c66fa4841480bc6c87f041d1bf722da78bf13983d485df3fece09e54b1fb1534dee2931eb75f0bb95f21e924e565e8e5b06dd16a9fd4868fe60295bcfee2f6c53481a13c9e49d468a8c6992aca5464619ee54f052f5cb2a6a4ed6abeb6951d22ccd0662816882497d6c8fcfe64152e6a9b6ab15bdcb43545fc3f2fe9caf2679f5705fb68b90f8dd1579b9346901dc16923d222125652c8b15b5e003f660fc1af452ee0edb61b67272a3369ffeb3671f2bfacaf3b9452db611760d95c734151639733adcf7dcd2ab7a298d7dd0d31c61004be368b9858d19907eb76b421e3524d83d4a2dff76c73abc0de61114f6c7d61622074e719b729c52e9b11f65e8260e90f66e71de5686c89da73e9b1001541d621663c3613eb4ce2faf7f9ae94f0f17047e3b283baf98145936ff491c6c031a2059e2c52a7725f0790943bdd21ecd3e237000fa8bf27e81343902489101dd96f2a9bd6cc1cb9c4f4a9bf33ec39b0743901f8bec541fe9090d984d9c071eca64ee9fb4996564cad02923c0a662db9b42d76bacb09314c6bae42077ddab05905a02f3cbab41fb6a9e8c1ed2b27b5052ced38f4192cd97e0b9747f219f2484b46add32e937fd7f8fd8098aa2147e3e1400226703860766549868d719a8c372fad4ea7c8256908ba2865c68683a2cc28436b1effcd6e5ad990b83824181fc80a576f8906a45f56ce7e3748ad4a4385143768876d1e73ad962eeb6a2466f42573da8cf4a082997ffb87efc7f2711b92af0b36a72f1157c0df404aef2f958b32100991574ef4593f134d680e1a87729a577d7432b3e2ccfde6fde5334cedb8b601a07932f2f63835705e480e57f92b51e4a08ec44e07157bf6f80095fe908637d569708779eaf5b9be3c33e0dd9b840c3e1ef3cba0a0bbb868b4f07b5abb934fcf5d47d3511941a32e54ab5d4c547b81708dd5a876d3667f8447e6819625f49ac1e8f8bfd9df2b190aa318927d212c964a5b8b36c2a94d7543c8d94c4e2a1a43824cf652873ddbbdd321b473640f0982cbcea32288c6ecd2272e57cdcc20a9bd60a760de289bd86cdcf590cc7118e407ecd369412e544cc1d256e177fadc3fb15d8238199782aeadea3f33558dd68ff042d9cb440f556132dae1fbcef3e693691b089939883ca0e8c94a630d45c6adc33201cb274ee3f3225cd2a835b4b83e0a319eba92cc2bf728f6e5bcb786ccf8ca7c42e6fd2a9d7941580a8f7983a6d9d88ffa6ada598ef4571d6d5ff67917f43bff4df2330081244bd3fbaefb21b6a8d14ab81846824379415c186726d20afcdd298b921bb850eab4bdd188d72dd42d6f1a211b580e0ca831c2443f7f50eb911ac3b3100513be666b3a48be024471f92e1689909392670c0f3d7f937ec318ff9a1f1fc147597e49e735978abe5ebc1c1fb6474acbb610af539c57a248fbaa8909587418a15e536a53801736ea27b120e43a070a8e2f402ce744d71c2f81caa3a23a669462c1e0012009c0201b9cfc5b01a78b26c2acd939c1ebaa5e127b57c58078a79dec8bc206111e4cba54b645d0dda5e7cdeaf1f9e6374037f8ecc7d72d2802b0a5981f48c75b1f15ade54472450e0f16736902702e915117ba02344ed0d58bcc9f2e03fdcf6907812a3655dfc07602144a16e5e1cbcf3629a8bb274f8c1652db6cbe12bab258d574181c94a8972392428a0bafd1c021bfe42df0a942f87c112c8bc340bd518b3cce475e481b7006e266065ca620d70923dadcc7518df79198990ac8e7d99f066eba8bcfb2992515f5cbf2da8ef55b19fac4418309cf7bd237cb69b1d7c6a3c6b456f1ee228b3e9fbaf1b3cadddfaa307039dff33ad59bcfe44851c33fd09346e5791adf0b0a846326266756fa5a035a840e79ff0fc1735b04a4f611da1c29f9ca64a0a9d1d07bd000027100000000011e1a300000000000bebc200249eb27b82a5de32ca44c8d8e38e705c62f5f4d3b945dfb5f03973dae05fa43885000000002b40420f00000000002200207f89b60332c0a813268782be20d14c67626b76aa4832e1b9726c57a01750bc83475221032edd70e88cbfcda8c91eb9b20ff6a2c569a52de908933b048bf6b8414d7667b7210386998d8c3ecc235c80eb4605ec24c5192d27ddef57d204227d3ac0c54547312c52aefd01af020000000001019eb27b82a5de32ca44c8d8e38e705c62f5f4d3b945dfb5f03973dae05fa438850000000000d2a9188004400d030000000000160014a203180611650c5e77e05d64ff0d794aa4ad35ae400d030000000000220020fea2002eacc21b3490a177df4ee69f30c231d919b99e0b32bf518767169aa764286a040000000000220020f757d7d804dfbc35427f8bffb749454a114be5055a683d08ea66581d1e51dcfce093040000000000220020e518e9c7e70e16eb89facff2af3f233e1af45d8a6d04ae7f36f4fffeadcf3e1604004730440220203be2c76c9d051b47db6da5a99ce689eff53ce5bf016f1d9ac403ab7c9fc9a40220290da75c0701cc212ac502d3d894801e92a701a20a4e85c3f640f579f96762e001473044022006c47ea4c15c389369ff75d25b83770396920a1f06a2c468ce56a32f9cb7cded0220759b6227e0da03ab542187f482b9f6123c93e3187070de646b07547e7493e8ce01475221032edd70e88cbfcda8c91eb9b20ff6a2c569a52de908933b048bf6b8414d7667b7210386998d8c3ecc235c80eb4605ec24c5192d27ddef57d204227d3ac0c54547312c52ae08758b200002000324cd3bf6d98e9f7f88be0e61167f9797164b578df264206f79a96e104cf4abd0e1010000002b400d030000000000220020fea2002eacc21b3490a177df4ee69f30c231d919b99e0b32bf518767169aa7648576a91490767756314724028f101050cd76819b6a1756368763ac672102551ddb3bbc7ea3a02cadba123a00b171d7b75ee46e7aaba9caf112012c77ab587c820120876475527c2103b89e41f7c1cefc7864881d9a78f262a9077a99cb05194684e48591bbffc0a5ce52ae67a9148acca5ea2fc12ce9d71ece802b1f500a7e84378d88ac68685e0200000001cd3bf6d98e9f7f88be0e61167f9797164b578df264206f79a96e104cf4abd0e1010000000000000000015af3020000000000220020f757d7d804dfbc35427f8bffb749454a114be5055a683d08ea66581d1e51dcfc101b0600402470f4a38f40a7d71f39f9552254c007ba5557adbec6ffa7176669fb309195d75a33b4556e6f35536757085c24fb83c09ecc1cdd976cb8d2b0bc679d461789d040db8c19bf05d1d55cbe50de7ce29c9388bb541f6397dc43f9452a92a931c76c42722ce6ad02d0343dde9b692e001349d9b1e075527f1a8d3d1aa90fc72164271a000324cd3bf6d98e9f7f88be0e61167f9797164b578df264206f79a96e104cf4abd0e1030000002be093040000000000220020e518e9c7e70e16eb89facff2af3f233e1af45d8a6d04ae7f36f4fffeadcf3e168576a91490767756314724028f101050cd76819b6a1756368763ac672102551ddb3bbc7ea3a02cadba123a00b171d7b75ee46e7aaba9caf112012c77ab587c820120876475527c2103b89e41f7c1cefc7864881d9a78f262a9077a99cb05194684e48591bbffc0a5ce52ae67a9144976a85ce7e37d8557d74cdd86254926d991f77b88ac68685e0200000001cd3bf6d98e9f7f88be0e61167f9797164b578df264206f79a96e104cf4abd0e103000000000000000001fa79040000000000220020f757d7d804dfbc35427f8bffb749454a114be5055a683d08ea66581d1e51dcfc101b06004062a64d249f7301aa354b7951f0c7b13882b7196e7985727395c624bdb84ab9234a5e0edbff3b5a5b12bd385a695722be5aef598ab36ec1eb605e944964a1adbd4061013fe37fb5d1ed7f8d8137501a755c195bd2bdcf345e30cac31c2962f4e0aa0614d7f96b9c49d8120089f2d24919ddf40bda3af04312f7d5255248075d28e200000000000000010002fffd05aa9eb27b82a5de32ca44c8d8e38e705c62f5f4d3b945dfb5f03973dae05fa4388500000000000000000000000011e1a3000a00cedece5db1cf150c39b679dd048140f491a72e93196f9e205841a23791c500061b100003f2b3c9277a3dd9ee0fd08afce183d75f570299155a8dc5c1c5acc79a572629c37ee817bee5023531eb3929c8e95025deb4600cb6ccb900176a23ed7cc35f99f7266ec8b0e59f8e0c0150916c2533133bfd105e883ed7b33915f7a532e36d46db78a2842d7e99f1f8abc863a5f6f8866b130025610795266d8a9603a8ae11ee23ca765f9a82ef00686612da9f70c2b2c2ba242bcaa9e3d95e542cbe59461a75e5a8f01553da2552d363593b8a85bc546f17f8e8bdd1449602fe3f46ed566e42a4155cf0b6c26df2cc5a8312ebebaa6bf11df9a55aaad2a96cdf41d7e70e815b7457c9332cc58ae9de3b9f52da71e7f328afa8de7777c76ea82e17e4a2cb46c3669ccc5f644414764019bcb2d4069c3e7a29814f0462abe479804d4dcceb498f1da52d5796f69f7d1d235e2da967e8683f77e7f206034ab12c02aba8554ece3444f8e0803df9ba5a9b1b918f13d94fd89235e1e2ec32df3154b204bb7642d33112ce70ef5384b11cf07bcace83a97339e1f9fb33e4b2cf1ccd62cb5311ab2124a8ed33a6c95c49ec90d9a477f3556d098a39235e8f1b904ed7aec0052deb3173f5d85126bf90271c567f3e9a10c12bc50f37f41ae40b49c71cf74cf18cb6e5eac206cc596349503f913178dcb3ee4ec5410b30474a4a2831b18ac07cb78fc143e056aee802aaa8bfd5d97e403e718069b221e3effcd57accfd13bb61d4eb78e98f269e79062c414a9e0b39075d8baf371c0fe09aaed436445d62664de1a96e8c974a3fe0cc045dab3064c7601dda9213d89b8fe30437f0b5cffa296bce9c141e3c012502431ff0cd5cde95eb52f9dc78ce3fca95b6a75de178ed13f9e3e7610cdbd1a1a893dd635e07459aae22a8f8c5bfc0a33a1f88fdcc1b99173080b602f91f1c9549b235e21bfc4ca071e0070f0057d65d98343cd82035970f6d75fc9a4b191270d83cb0dc6aa84238567e230bb68d16b0bba3563a28d151b308a74766eac50d4b4b287e1f46230ed1c4e8259cefdbba86c367392097909a740f692b745bb8c4809115ddd42de543dac65245faa6870f25aa2df16118d6bee2be181789ab64e5ba727048eeda81e6a90995c681924b2f807554401b6aef9436a345253be21747c313e8d9e2bf048d890350c055016cc61a06dc082a2b2c1b038405248ce18bd5037afa0e04b704198d6129da78ef9b97a8cee66a1104acd89c2bb2ab57d519f6693fd94fbabbca63fb9bd29decd9dacb34000f0f40af6969577f37a9aa38b4f2cb3d5d974a3d53440e78aa7ba013ac9a242be930e819ec36a96850cd7c630ea102fab614f81a4c9b9a01e60aaf9956a4f109cf5496ac8a43d03b0802303a6fe515199f9dfd4e66c2eac124d4653e999702832073f75ebc177fffc3efd404141927b3635980a40ee6ae50ff14010ad8e21493a38e4930a82b9d636d7115a55511bf4296d80ea8105a07f65730db9315a084600be9a3dd2b19943fa7cc85d2293de47f7799459288caa8d40c55605b5abfdfbf1325d0ea90aba749b0a625847f4b006ff34b6c9bd14a1c107c8a0175983ad10ae47a285b7d503e870625711fe3e1557377433ee845e2254c538304a97850e5acd2d4ba14241630b026230ed508b84f9442d6fb9a45369e2cbbd0d494cfa2573d4a0e553c0013ecb33d44f2395e4e4a3f752b8f86955061eecf4a9f9fed27648446369a8dcae2e6ae0b51b9a4fe315ad5c7521764738cb591734b32a8e35c1d6c80d9202aacdbf65cc243ba0640f8f8c23d637d7331c5b9f4c44fa5f2858cf2d74937beb4b345d22c2614bb6346f38933f84aea2bd5456505709fd8b5335fbe54e99c351e151f1f209dcac9e37742d3978c9a95eed0b29fc0b4150229a0990f465bd3bbcf97f73237961042359aaa0f11b1bc4c572de165a6372f3f438e7071a197fffd05aa9eb27b82a5de32ca44c8d8e38e705c62f5f4d3b945dfb5f03973dae05fa438850000000000000001000000000bebc200a043ffa6f358e330873add2e0d4f05a72150cc831bb2f1062e5c378b9bced8e800061b1000025eacbc7939a2307c66fa4841480bc6c87f041d1bf722da78bf13983d485df3fece09e54b1fb1534dee2931eb75f0bb95f21e924e565e8e5b06dd16a9fd4868fe60295bcfee2f6c53481a13c9e49d468a8c6992aca5464619ee54f052f5cb2a6a4ed6abeb6951d22ccd0662816882497d6c8fcfe64152e6a9b6ab15bdcb43545fc3f2fe9caf2679f5705fb68b90f8dd1579b9346901dc16923d222125652c8b15b5e003f660fc1af452ee0edb61b67272a3369ffeb3671f2bfacaf3b9452db611760d95c734151639733adcf7dcd2ab7a298d7dd0d31c61004be368b9858d19907eb76b421e3524d83d4a2dff76c73abc0de61114f6c7d61622074e719b729c52e9b11f65e8260e90f66e71de5686c89da73e9b1001541d621663c3613eb4ce2faf7f9ae94f0f17047e3b283baf98145936ff491c6c031a2059e2c52a7725f0790943bdd21ecd3e237000fa8bf27e81343902489101dd96f2a9bd6cc1cb9c4f4a9bf33ec39b0743901f8bec541fe9090d984d9c071eca64ee9fb4996564cad02923c0a662db9b42d76bacb09314c6bae42077ddab05905a02f3cbab41fb6a9e8c1ed2b27b5052ced38f4192cd97e0b9747f219f2484b46add32e937fd7f8fd8098aa2147e3e1400226703860766549868d719a8c372fad4ea7c8256908ba2865c68683a2cc28436b1effcd6e5ad990b83824181fc80a576f8906a45f56ce7e3748ad4a4385143768876d1e73ad962eeb6a2466f42573da8cf4a082997ffb87efc7f2711b92af0b36a72f1157c0df404aef2f958b32100991574ef4593f134d680e1a87729a577d7432b3e2ccfde6fde5334cedb8b601a07932f2f63835705e480e57f92b51e4a08ec44e07157bf6f80095fe908637d569708779eaf5b9be3c33e0dd9b840c3e1ef3cba0a0bbb868b4f07b5abb934fcf5d47d3511941a32e54ab5d4c547b81708dd5a876d3667f8447e6819625f49ac1e8f8bfd9df2b190aa318927d212c964a5b8b36c2a94d7543c8d94c4e2a1a43824cf652873ddbbdd321b473640f0982cbcea32288c6ecd2272e57cdcc20a9bd60a760de289bd86cdcf590cc7118e407ecd369412e544cc1d256e177fadc3fb15d8238199782aeadea3f33558dd68ff042d9cb440f556132dae1fbcef3e693691b089939883ca0e8c94a630d45c6adc33201cb274ee3f3225cd2a835b4b83e0a319eba92cc2bf728f6e5bcb786ccf8ca7c42e6fd2a9d7941580a8f7983a6d9d88ffa6ada598ef4571d6d5ff67917f43bff4df2330081244bd3fbaefb21b6a8d14ab81846824379415c186726d20afcdd298b921bb850eab4bdd188d72dd42d6f1a211b580e0ca831c2443f7f50eb911ac3b3100513be666b3a48be024471f92e1689909392670c0f3d7f937ec318ff9a1f1fc147597e49e735978abe5ebc1c1fb6474acbb610af539c57a248fbaa8909587418a15e536a53801736ea27b120e43a070a8e2f402ce744d71c2f81caa3a23a669462c1e0012009c0201b9cfc5b01a78b26c2acd939c1ebaa5e127b57c58078a79dec8bc206111e4cba54b645d0dda5e7cdeaf1f9e6374037f8ecc7d72d2802b0a5981f48c75b1f15ade54472450e0f16736902702e915117ba02344ed0d58bcc9f2e03fdcf6907812a3655dfc07602144a16e5e1cbcf3629a8bb274f8c1652db6cbe12bab258d574181c94a8972392428a0bafd1c021bfe42df0a942f87c112c8bc340bd518b3cce475e481b7006e266065ca620d70923dadcc7518df79198990ac8e7d99f066eba8bcfb2992515f5cbf2da8ef55b19fac4418309cf7bd237cb69b1d7c6a3c6b456f1ee228b3e9fbaf1b3cadddfaa307039dff33ad59bcfe44851c33fd09346e5791adf0b0a846326266756fa5a035a840e79ff0fc1735b04a4f611da1c29f9ca64a0a9d1d07bd00002710000000000bebc2000000000011e1a300f36f3bd94a6751ab579d9481cbe484dd6b1d2abba32bcc757aea07e70d0ea28c0226f5d9131a28e7d24ecc1b7fa2b63b34a379879f645d8e3346aea28f9ab603eb00000000000000000000000000000000000000020000000000000000000200000000000000000003ea1865f4cd884edcb9921736b2ae36b50000000000000001000384fe405b653143169925b03dd2cf38bdff034a0fd7fb350f7c089c1129dfb82cc772d5525d0b922cc3d989fcaec7c16b03c3249eb27b82a5de32ca44c8d8e38e705c62f5f4d3b945dfb5f03973dae05fa43885000000002b40420f00000000002200207f89b60332c0a813268782be20d14c67626b76aa4832e1b9726c57a01750bc83475221032edd70e88cbfcda8c91eb9b20ff6a2c569a52de908933b048bf6b8414d7667b7210386998d8c3ecc235c80eb4605ec24c5192d27ddef57d204227d3ac0c54547312c52ae000100400000ffffffffffff0020d22458cead349cb596ccc159d17f2809dcc22620268d1a300a6e152547f7235280007fffffffffff809eb27b82a5de32ca44c8d8e38e705c62f5f4d3b945dfb5f03973dae05fa43885389eb27b82a5de32ca44c8d8e38e705c62f5f4d3b945dfb5f03973dae05fa43885001600146663df19ca3fcc1c04447b18d2cd795c485f1941389eb27b82a5de32ca44c8d8e38e705c62f5f4d3b945dfb5f03973dae05fa4388500160014d5f0a47e22dd767bca0be8f6d109a81a8815ff33" val dataNegotiating = hex"0100240000000703af0ed6052cf28d670665549bc86f4b721c9fdb309d40c58f5811f63966e005d0000928544434bbbda1da0790cf138ef4b3881f5cec34b933ab77ffd57a7e12992bf780000001000000000000044c0000000008f0d1800000000000002710000000000000000000900064ff1600140cbd801be794f9854b38981ee859e3a000ad104c0000186b0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000229a82039dc0e0b1d25905e44fdf6f8e89755a5e219685840d0bc1d28d3308f9628a358500000000000003e8ffffffffffffffff0000000000004e2000000000000003e80090001e0234ea57c6a0d7308e0479811f0315df88650da7a8af626fb6ceb9a6b3e1bf068e032f5bf3637d4efa39b50a7bad5e3f6d32663a1cc207a166155f00f8b9a9f621cc026b8899cafac94bcfee408aecfec60e86a30082b0ea587d8a7ab6b2b309fc66110210996c2725e4129dad191f6c6d9ba8c35ab58df4d340051d7025d366423aa15703bf59f021a7431277a31a53b2101bd3ff5730adefeae596020e58c9099728b7f000000003229a820000000000000000000000000009c4000000002faf0800000000000bebc2002424d4fd09fbcbde0363fda5d43c8bc68cea396aa1edd3d48d118ec27bb30fd1d5000000002b40420f0000000000220020552fd9e112e447f57c95b896d384461ee713c8108894ced2ea1272e0d354aab74752210234ea57c6a0d7308e0479811f0315df88650da7a8af626fb6ceb9a6b3e1bf068e2103d45fea036aa6817a71387c3976790beeb4705739d4cf0271007043854dde877552aefd01bc0200000000010124d4fd09fbcbde0363fda5d43c8bc68cea396aa1edd3d48d118ec27bb30fd1d50000000000c089a180044a010000000000002200207ba66732d8b8e8863cbdcad193c4602b54df24f9af202a977e3a6315e85072704a01000000000000220020f25aee697436b14ebdc0bdab0b3a0c339c98e49cd6a8b84fbfb84c7c5557aad1400d030000000000220020a659aeaecad3be965ed5a498adac881967d2d3ed2a773019da1b26337c7d0d1372270c000000000022002095c2df1035ebb714a728a166d88332e1569b3da5c035037df1bc07e227b7e1ec040047304402205837856dc4bc8f4a679015460580c38a29899986f6cca09afe3525097dcef36702201b2abd6fdbfa890e247cbe6a096bb01f3d47901a552f7f5e5c6ecb6c80a07d1701483045022100abfa35999608ea0c993418f7d432c7f9710b993f4eb45e17fbb95e10c6899e190220542593d102382a92a11eac65bef87a75742ee4447abebb38fc47c4d27d74f9a2014752210234ea57c6a0d7308e0479811f0315df88650da7a8af626fb6ceb9a6b3e1bf068e2103d45fea036aa6817a71387c3976790beeb4705739d4cf0271007043854dde877552ae68075c20000000000000000000000000000009c4000000000bebc200000000002faf080054b02aad4844030f2e1c3c61f95b34df8d14c0fdbddbe5d56090667016ca8979033d0000a1e29b94b3517a04106dc7bb74f4f091a2ee419d889ecf8434bcfdf127000000000000000000000000000000000000000000000000000000000000ff03228da9a93e02211af77afa576b94f57d747099099f5352298d8b3c4dbc7215c62424d4fd09fbcbde0363fda5d43c8bc68cea396aa1edd3d48d118ec27bb30fd1d5000000002b40420f0000000000220020552fd9e112e447f57c95b896d384461ee713c8108894ced2ea1272e0d354aab74752210234ea57c6a0d7308e0479811f0315df88650da7a8af626fb6ceb9a6b3e1bf068e2103d45fea036aa6817a71387c3976790beeb4705739d4cf0271007043854dde877552ae00000024d4fd09fbcbde0363fda5d43c8bc68cea396aa1edd3d48d118ec27bb30fd1d53824d4fd09fbcbde0363fda5d43c8bc68cea396aa1edd3d48d118ec27bb30fd1d5001600140cbd801be794f9854b38981ee859e3a000ad104c3824d4fd09fbcbde0363fda5d43c8bc68cea396aa1edd3d48d118ec27bb30fd1d50016001458043e6e40996eb9d3c77752a81398115ec43d5900010002db71020000000124d4fd09fbcbde0363fda5d43c8bc68cea396aa1edd3d48d118ec27bb30fd1d50000000000ffffffff02400d03000000000016001458043e6e40996eb9d3c77752a81398115ec43d59ac1a0c00000000001600140cbd801be794f9854b38981ee859e3a000ad104c000000006824d4fd09fbcbde0363fda5d43c8bc68cea396aa1edd3d48d118ec27bb30fd1d50000000000001a54fa574848f29f143c52f2717510e2a8831afaf7752217ce3452c7e88d24eb14905191e04229fc6433aef69bc33f9f2f6eb3c841fee628f7c583b9efe5a149aa47db71020000000124d4fd09fbcbde0363fda5d43c8bc68cea396aa1edd3d48d118ec27bb30fd1d50000000000ffffffff02400d03000000000016001458043e6e40996eb9d3c77752a81398115ec43d59f81d0c00000000001600140cbd801be794f9854b38981ee859e3a000ad104c000000006824d4fd09fbcbde0363fda5d43c8bc68cea396aa1edd3d48d118ec27bb30fd1d50000000000001708fc4039310f093081478d723e70b6bb1f17aa925472ccef2f79057aafce602726039f88ed9a0eb0841c61c39a5c224516288a81a53256693588f5af97e9e76c88fffd014e0200000000010124d4fd09fbcbde0363fda5d43c8bc68cea396aa1edd3d48d118ec27bb30fd1d50000000000ffffffff02400d03000000000016001458043e6e40996eb9d3c77752a81398115ec43d5942210c00000000001600140cbd801be794f9854b38981ee859e3a000ad104c0400483045022100ced76c39d6c63a52374b17103eba46ac6d21b5f5e427d48ffcd5e505a26477b90220588f30b94c0938632bcee8cfe9bc185325b2edde88c85fb4d226eda215abf26b01473044022042741816de3767e7b54fc1cdf94b6f0072203daf76c01ba5abb120801965413b02205237d5f3978b2332aa14ce65501fa784f51ea4e97030d44536f52f188f768074014752210234ea57c6a0d7308e0479811f0315df88650da7a8af626fb6ceb9a6b3e1bf068e2103d45fea036aa6817a71387c3976790beeb4705739d4cf0271007043854dde877552ae00000000" val dataClosingLocal = hex"0100250000000103af0ed6052cf28d670665549bc86f4b721c9fdb309d40c58f5811f63966e005d0000948d8efaf118cae9f142433a624b41a9ef7e09327fa45083ebd7694e1a61c429980000001000000000000044c0000000008f0d1800000000000002710000000000000000000900064ff16001401396601573e7aef81f91a89fc4b4b56feb7a35e0000186b0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028a82039dc0e0b1d25905e44fdf6f8e89755a5e219685840d0bc1d28d3308f9628a358500000000000003e8ffffffffffffffff0000000000004e2000000000000003e80090001e03174f3de90105ae02d88ccc1a7ed4bf0d116f27ef6010f1ec308273c1010ae3dc02fc17b2289973a29fd374ee24671d5d9643465a11bd725bac1d640b56493bd8f702b5460ae3379bc8a92d2aa2488f3e55a73d8909695e677beddd61a94d3655490f0357a1a37c3ae33b2a94bca0b6ae541036c22feeca86860c7c5501153ccfffd585028fb43c64d53c5d891bb0af3b7ed41acf3ebb0de59599b3e7836a8401645cb6e000000003028a82000000000000000007000500fd05aa0a007eacf337b3a80941f2defd530cf824f13cd263ba2ca194e7170072ce28e8000000000000000400000000017d784077c3e8caa53f1a775a5e89b1a54488aff835593d5e2b7355179136bbdd10a86c00061b1000020b7604aeb7cb080b12de62f75a292bed3134b4a3de764bd032fb049e2c2a1d3942cc11b9b12619d42cda3c7eb63da952644a3f355bdf772d77f1fc2a0b36bf116cdacfcda3b77974536cc3f3d0f8209dba69408073cbe0f039eba220fcf3b0b96d5875bb71acdc999fd9feeab68a0b63629efe0dc91e92dcf93b3c49285c981746a68ead7a96a9c1ce21284a2796b0051e6b7cf36a264d545063c054454b87cc3f9ddad5350382585de18cdc4e65e02484695f541b8fc082c87ea4a56aabc84fd1b7c1cd40e3517ae811f9ff921fba672e0191c88a2681ef8ea1300eeb6c1d8fccdb5ab05bf80b2a5c3ed5c018752cc841305edae02149389bc5e58ea5a59a1c59755c7ab5f35e3740c9f6218d227370363a7e386b214f5b2e771ea8b94a2a5e640d8a715d57756665f4a659f4ef6488f9ceab5e22d523ee52da368701d799fcb3459a31e6fb03de91ffd9b608656b172945015da3e5000f7f6c3dc0b4e102ba5f101bab5c2ceab8021d071bf89cf9d65d2439fe9a9dea4291eccb43a431904313655391ace4b82bf5da6270eb5bc12a60a69e7cf96b75a699db5a374713558eff7101bb2d8471e0c4ad0e202fd10aa46098bd5565c1d410e695fdd799c866090f1a7aa002305388acb68c8d82d588c1a66df5fb12653686bc4cf487a3484c0c23578a428de3df57539ed11227f2648bc36261c7f3f4f13e18d238dc856b8dd8f07de9fb73663d3a0026a03d9ee9f807e2a03c9546d2537a1f30a1f06767622d8bacdf4ab3b0f245a7b4f482baa60080fce3e7e15d2e086c670d6ec11d907e3da593977c8c25d620ed40cf82dd503c25f1a5f3e8a5ddb65ae7117600794844252e1448d17849028bd5df960a5fddf56e48cf082cfbc5c29666bca6af335c06f8240912a311e6c07946eeea9ef57e46b3e48b95c82cbee3830bf2b55d5e0223b9480fe072729a8af4c6c8c2f86038cb8a2e02405ce5f834c87b241fcb9963f008c273c64bc1f7289cc3a0c5eea7ea1a6dc7bc6228a97978a2ddd7dc49303c5beb15b36c8044f656716cad0a62d1e8c381db46f007be7f8096f72d3a8f08d338d9f2bbc43c0244215df229824a9ad34b655d840b38c5061462d54358be1c184b51d3a805beeea78047f544b15cc333d591f3d8cb60cbdd78e58ed47d21739762957ed6365fea14d7ba8368371fe4333be4f5ae289ff444c9f377a072a3a4173bd2680c6d6074743908d9c4f09aa30d064c7866a7a34303fce53deba6a597a24c211d209815bbff97736ba9fc79e390b36b2343d2590c8fd6db3e54206580eb7a53b9de09a42cfaa2cffb00ea90dbd07f1d357e69ca96fbba4efefc4e07b1a1a174a9a8a5568c0ec9a9487add3890a20391eebd69a56c4dd1a7c7112766b05d29fcfdd0f60d8c3f7287ec070201b4d0200e3ebbf47a97c230a7d2f05b25bec59cfd125f6cc15529f13fc624ebfd387327119434b66e61a8446e9fd9e14f4e0a42cee83f4600b195a06f4f0e55d67239c55256db69c3eb5218f9d214e0d9ca0992dee76630b55a96136a251a84711096475028e326782112f2afd64c3795f438ea623754cb0ea5e6a0d4e1ded7ee633f1eb8bf71b791646c8953e54a07242a178c02baf8fc68e7c1d3e6982b265802f50353b7f1eb0d8f33c9aed1b18432ecd04d10f951473a0e7d7e3e88a3cfca46ad1b11c5abca59bab0c8e880519753b9f4a9ab4f7a756d58a389dc3bdb25940a71a03899125b08efd7ec85b3cf0c1577014a81bf63b2144617cf259383a41af2d50a7ebb7d45a8968e3e3edfb1f4a45368ba380d172f82e641eb16949e192a3c2a37117df8e22fb7a4e7ed425f9951b392bc59184db81899ed2270844446a29aaed5cb3839c392d51636a24b737a3100417a849104c08606b4644a785080b67a92dfe888cd987100fd05aa0a007eacf337b3a80941f2defd530cf824f13cd263ba2ca194e7170072ce28e800000000000000070000000001312d0077c3e8caa53f1a775a5e89b1a54488aff835593d5e2b7355179136bbdd10a86c00061b1100030159105c3e04b59668b1516a793628be01d018e0de5972a7e6094a8b29761bd07a1654dc17ab21c8f940806cd4ccfd904db9594a8170f310b1e2d95e0e8b0baab7f8484c2c66a91b7f4274ec9e5cc3651ef2ee3a0177281548905a3c7d03c4ddf2bf8b736a940d69f2a5e6beaea33d92ce189a96803654a52b0d3da0cbdbbe0725e64dc4a6633f33318de0f6ca50b9f2a79ac68fdfe3a6f6c01a5215dc3bdfb56a780dc17968c5afd3270c50d4f7e1f540364e184d460e8b8479719788023ed029ad1439d0a0c85570b7a3f50ff70a82bd9ff9c04d6d8154046a30a3606ce25c2fbda28c863109cfaa95b7fe4f96622c715422ed1a8e99ce5bdecadb7c39798822115215e3914409d5de1e2c95a6c375c530b27fd0263d02167eb28628b945280a668f88c607bd74e3aac0ac704dfda9e796a76e6a856aee502b41c6f3932b6a89425484d580b6abc232cb12530b38b5c20cbbdcb0357210c3ad09a3ad7a56353dbbd6087f7cbccbae1f656ad06d370e4ec5a7906c9841a1f36f24ba6eab5c70b5d66bc8aecb60d9feb4576ef33b23456332483f01fcd0e01477789448ddc20fa207f496db56203fdaf53f6d64d97153d8e8c8c89c821f526f4b376e929d7598cf368b826313eb0ac5e435097b3f4acef26cfb30e63ab70622ff1ed04f9a1c02074bdb2d302d932cffbba4f833ab95912272ec87d8c05a8c5f1b2b101fb78a75cf9d0ab6e751163f27018f08c2fae76c7a6a417cf5cae2cdbd867115d9c1f162e83c3fc4f52202d3471212c3ae6eb39f882aa322609958dfbc8ca3f3a2eb051ef1b43d452b54c2352e8c9d184cbbd46ea936161067893164a72a34f6e2fd63c94353e524c9db699d15cef86f970bcf6a92dc367152f9740e84b2c292dbb338e4f21e6a47171b5a5cec0f4026906b528ad2c115866fb9e807faa200b600637abd774148f7637789946a82ec5c8e35692470c0c0f12a6a39a0c5dddf73635f2dbbb82d9ea56d8313a25cfd879ee024ee5144817b1f96945f34632cf0a5a3dd3ebcb8b42bb6c4b1c3d2a7fc6f817c97ec6282a3981a8d9e3d7070c178f7df847fcec8013b0a0d07a4f8c13c829209172022e0d724caf5a01219575f1d5a26f50f53d72ef8b596ae2263d2c2eeb822166178d56eba9ee9a9c60adb4fe3a7be89044d34288c7bd59cbf6e88e01f971b687200fccdc68d5a21f8430a8e5654a17f05773b2254eb301a5624c4aadbd3db8641cfe866ff72424a891f5e0487a48c204870c932ed9895427ce9a3d0a183fc40b7bbea3617b321f35cbba2c2180908e9bea2e07e1e5d8d5de9846994b78a313b8828eca935f4bdf9ca861326cca20776c6a4df35eeee257899467973941e6e8c567054480a7d8077e6e61ab480562ad53ad8127874a7fa4f747ccb2601cfa6e8c43e89f678dd38e4df80adef7bf07149edd32bf0e9775f3478870da6af26709a5bebbac77018050a07f1a8ffe4539c2df9de1dfe18c9bf0aa640178b0912bd9631acebdc2f2f993039b6cfa414d5cfcd0c363a178443e954db312efcd4463ee7cfe0d8a1eabe74d47692653f996cdd9b93c9fad41c5b16aa91a7bd5b267578a537e45d2af048ee0ce09ea41c72020d61509e5e91575022e7d5956b8e680f229909642366d5a16a17f021f41ca3d13df75ac3d3c8c772c2ba042680ba81466f8d05c07e19b1cde5a4d27ba6b820a63fffc5a42234e18109f128cb1e3524d621e38855b5c11cfbe7edf25dc3cd470308971b655b3381f946531d89ed23ad24f6a3cacd022fb9e5eb1d5a188a5d0936d0dfe3c7c424dba5f8892b2adda87a171d73bb5c5b8f809812689794ee3a5a7dc7d80f9c84bdad2fb7f89b2a45dc25836a42c8757eaddabcab7f82e1e51502cdcd3c4745009c55fd70b1c8f1a748e71e2b96b312f71f21cb00fd05aa0a007eacf337b3a80941f2defd530cf824f13cd263ba2ca194e7170072ce28e80000000000000006000000000010c87c77c3e8caa53f1a775a5e89b1a54488aff835593d5e2b7355179136bbdd10a86c00061b100002a9a1e8cbe48ae54ff2f32eb81ac70966e623abd77532a8cef6c3dab174da1e2879020c2238504e525d2d3fae9adb39044e8e6d0c394ae9e6ff1f01ae21e354d0bd1a5970e77015dbb6a635157b6465c32aee891c26ff8942ccfd24b612e4df241c55fc34dc1a5a613d431b813e14d0ad78023314f93c38f2bba6a6ea6e642d59a547f97b306ae0d072944c62cdec15933ffd85dafd9cabf278d9b8121db56915075baa049ac0d47df8a32b6c54a9935fbc1284fe8af288d3dd72870c8faf77e34a20970bf44b47bda06f2b8bfc931252456760ba1fa58669a3ec443737b429095db43f5bdf8e5d7f2d2f9c7318cfe012213ad35d54751539605337143de28756a146779a41308dbf94be4c9290422cb79ba768c340bc91012488afc3b388fbc253bdb9a35b1f4e39307c89f9ec3bb58e5da660013a741c1ab6c0cb22a3c94db0bf6d207599a527f18831530179880ef00950886378abcb99d2d1502b874669fb8f0a596ce3909e314057d7d1f668ca80e23c46f86127a71a729021623038d23cba281ed4967ea654470d4fdb31b297def0d22f5897f58d28af0cd86287fa51722af2682fe259987f56a9fe74af94138bb520ed12bd86453cc44f31f00e337647997b56c8bf40e3e9233e42b4c4ffe2ccc438417c754e04c95a2e7f357eb238020a0b235b8757a40996b6dab0e09e526f891f1773153151d99f3f65e62f0db6d4d94fb18293ea2f13e8c900d575cc0800969ef1e6903e6958c02dac84a8e863bcb8226bd3c6bab1038b628661333449d801b8b739bb08e09daf59c969691306e9e09c68508c5a558708a9b138fb841906a1967ea6290198be18ea3941a72a95b1b55e38403bda57d391cfdb86db844a0d9b4762a550cb1d7010de80fd6507d1e2dc7830ccd49784f8e80a3c87d9301339572b0347db9336bb7b1ede0fd1e187ca94aba942fe2b5c230f7dd1d3d0376aa882136b112883999227e2be17e9d681fb813acb70807b47e99bac127ca67c2d9619049783f8a9089d3fea4275585533683308ab94f3f02f577fb840ffae279813439fcb30eb5874329c48160768c2ca6b5d6368775989b96a056f22f7dddfbcd1b22a7fb74bb2d1b36f3e94914b82709a9351e1be88364a17a36b2a92ef61bb0520fefb802393b9e9effd6d54741ab9c6dbf28911bc45b334d9c2a6d76d94ecc2a19a3115d0f2b5e5ddb1f29fc9db0b3a21651afc2f93d321189621d8b59ab07e8d4e348f4bdbdb25b91d19b313850afddf92300c7fcebd9b266792745a24a505c56a3f98428ec70b65b0396a46836cabe49024d382eb1c8227e2df4da21385960f3d3801fb63d73ae69a4fcb6aca7018e874e8bf44f73c5e845ce81b2c643862c0344e3f4e50f4e6cb51b53a6c90ea545bc897dd73e2d2b3250711ed2a666413ae85b22e848735e8a6306e3b80f3677c8f40f85bf2f457f7764343288530a9c58b160de657df482af5eb0f291a50071d207cf46969643c113a6b15354b0b590885fbf4a7136939463ef66e013cb794ac6ab0fa887352817827ffc420bd8d1ee0b6a04d6819eadc1d96517c2edd8fe028101cd9842e407a44a8eb6bbda3fc5c54997fa43aaf340ed8ab6f75e3b588dd906ebd9deba889711b3895bd7df494f042e68cd78d7e75c237bd22b90e49e5571e169487508dfea22bfe2c83f21ec1e91f7d9331e5ac4ba6c52c1183afb1e083f3d0c42af6cf41e82e9151b5717b934ba6e4f52757d27a7c8139c523f977cb9c7f29e4a19cf41a1288c60a9ee10f58189351a51925422276e2da9ce3a4ca6944b767601e686745e88b7902e0e110dd66189dec74e3abbc76a4045d5051a6b76c91b2b20fc2ab1ca7d5d63f25d2c83f5d8ab31034e3ca42c4af1ed6017f5b10c2f44a52d78bf858aa7c148b6f07156ee365cd463d3c00fd05aa0a007eacf337b3a80941f2defd530cf824f13cd263ba2ca194e7170072ce28e800000000000000030000000001c9c38077c3e8caa53f1a775a5e89b1a54488aff835593d5e2b7355179136bbdd10a86c00061b1000031a12d4e5b7253515c5822879f6f1738224e451910cacebbb545aa637e2a0f631a151e02f206b6397055534bd6a0b7c7990d269d153d3886fc7e51fd4e09c5357a96694911e9912135e3f9ccec1058be709a743ee44f07feebb0fc6a3078bec155a1b9f67afaac6914debcc890fd86150d790f8de1b7168d4501064dacfd16c19f61a8c13c7658df92d6e5ad79b1b251a96db66bfc498e8e4114f98b9b36bc41663c9d2d15a280fdae479c14e52e148b0f86abbe4f9ef78570e193585b5aa30e53d54352eba5ad54d238f0d756b54aca9889fb21c57b6c639a6713a4f655d5dde92391185a9d8c929bca42c3bc9ba5f65b059dcbab02e89cf2e95fe1b1fb291aa1c2aeb8b57ab24f92414fc296a37b683a1d47155acb5210ffb6a170642e0f1cf7a4704861099b23c0294f367f28bf6fb6f839ba3e958ba6954ef630f90d014b687e63decc26c395601a885583ee0f1a86de5d60069664e2b93a7e936579e934a084b3e34850a1c26dc5fe7a8479278e6000f5025552b0d43ec186cd01a4d6ae748ba9289d39046c3568982aac9593a3496d3eec561b538a9b0d9ed91a4560f504174bb70725fc1c9bc354afe11d1e8aab3389774d619fdff96ea096c8283c2555e9d3169c8dd543bc74eb9f3dd4f17105563922aa18243f7135429b7a71368b44975e07443fb6f5eae089b88dc2d729d87e303104b8a7172902cdb8500ce9cd2086f7a7f6ce683942caae21ed05596c46d8f87f98eadb034c472a3f6b9d7a83d41fa70b44beb4288973cee486adc191a9aad1d1b7cebac6225aec67eed51c347fa5c145e183454b2a514a5044808eea8a9b28b24e39b115e2faa75f04d370285684857129e14e6726bb23aa0ff9323e9687578446868705f3137289c49357ff4acb134f6f3f7dc7efe6b6a332cd2fbbef0579493c4368b70815ff13abc1e3cb08c3931d8b7c99bb8b5e89fccda77a6d51fee07754332500517b75bd26bc66c81cf9f0e8a34e01c700b86590fa1cc7682a6d20c10d325d735dabc43db87ae2700e4966d8be90e408aca19ba1327ab209d4a574095e37285880c31cd631aabafa6b6c31b6db80b989ec57141ab35a5d7e32445f153da3832b223831bcaa8d1cedf6cf9d8e2dc121fd1b8a744481690be8668d6185113853ad1e86fbfe5a1b216208d3300532b0c80bc751d805260f1e6b014fe8f0b904a54560baa1b9f9d81479024b9d722fa577d9708eeb5b84c5005766f2e2c622689e1d750dc16ddd74450fedec590cb49014d4cba6dff6d2aa2c15b71067c8c02128e587f6a09556ee2e8e6b1b6bb8380ea6e79f43fb6e427fa66f0b616b84261b18f07d3607eaf4b932f38fd7267c742c503862458a1d1f01b239e94f39bcce1864564ce2f021fd43673964e77d3616bf8405b4c770996fa48d312458b29be5c05a6941ce5b3b2ff4ff32ad784ea47a664fbc2bec22fb6faecf928539773cd5c0972d9e6a10762a66190c3b5cc9b77d3546ec02d355aeec68ca9af34b2f8c44071b6d9b608f17e24ec3ac185cd9fab9b9bfdfb7873e748796af1b87820707752798534334b0e79bf108d60ef61a2c3cbdffc663b54f2ef407ae43749d31681e3da13ab3beb1f4ac2053cc7286bd7a3192ca412d1692ddcb1fc33131c19bc312d72b1616b91110fc15a8f33b2429eb0fd07bb034405bb879e54cf2f4331c2fbafc69cca8c2ff5a762c7f139edbe123735e63490a17f309ec895077731e5f6d6a53e513f1a3c15eaf72db4605d65eaf5cdc830155f5b9bf4e96a3644dd0ae9ab1f09778fdcd763668507d1c49663dc4a64def5f24577d2b1b34113f6a2a92999bcaf649536e431b8c2c30491cb54fe84b7e087c7fdd1e9b92dfaa31651138e7602602a45d331528ebd79b450ea237b195e80a04a2261a00fdd918cd0b0116f9d00fd05aa0a007eacf337b3a80941f2defd530cf824f13cd263ba2ca194e7170072ce28e800000000000000050000000001c9c38077c3e8caa53f1a775a5e89b1a54488aff835593d5e2b7355179136bbdd10a86c00061b100003d4b11a6510316810f0248ea0530220e3255171fd5fce2eee5d0bff33d694904b77c108bd2c322ebc2c3231e1f78618ab9ba83f81fcbbc7278f4d0cf17edb4342ccf40ba133606f6597f474b0dde594a6f8af078aadcfc940d5fcccd32793a1266190f06e55aec9b95b9f2e552ee8d5e4a662a7cdddb20599b14e3105699f2618395ca9d80ca232f5a96e48e27a09b24b3c28b38b42bf63464dbfc0d233c635d1379784581f5ff2f2fa2c6dff4cf8c12454745c695ea394d0fc477f4907e82e636e347306ee70730f61aa75ddbb10cf023b28a5e1f7dfed48470bf4b3180e343ea7f578a0d8f33505aa36b3875226b668376db40b3171f5a2eef326b0a416fd27cd7c7936e71cc9822421d9e317db5fa31de68f4be412666c3ef4c699acbadf94d2bfd1f32ad1f962da04965d20d783047a415f5f6a59117422dc26c5f05a5ef0180081e9b7771277ae8520647e833c2dc80149baea35700c35aadce8c4c81ef6e3fc3ec55e3fe3b9f846710fd648668ca3ba05f6b7cf5eddc9b5a7e73f2ac4d1f53864765cf70f55128ec53692bf26656da9468ea93b7030063a2021ad57cf3ab1df019c21118f6f9cec64def026910242fc4809d2224210460d63d02f2d6475b371b97907cc3c1e72f56ce8285cc08fd4e37f439f39b63667c045f4b5dc5f982cdc8b32fa0392ce38dccfa6a79f5bcaccd2bdaae666404947fd8b6d8ad7e16ae1307d7b24cc15d712814d1311bdf2155ee28da446ddd2bd0e782c225a8a379073314ec486aa2a9dc54c4edc2e2dea278f39ee23b0d7c2f5df7a20ffe5d77541d1c42a94a17e977763f15dd889c939104b691553ec8c99d5c87a9513553a7384e3a45fac0193b77fd8b7a2c5bf291a6954c767addeca4c91a04946688491c56818bb9de51d2e2dfc2c0b2e8f3e929ba04d9b3f457935f8c797dd770cd6558b6238ba0706a500bd9aaa17565a8a8b8abb41e4717f312d9b449de7dcd5317e1f6ba71b428f5e96857fc9acaef6298d4e994746a45534715af1326c79836f0f3a7ae3aaa41c90f172ec8544d13086237420207fddbae7d349a2871a62f465a6c57bb54e623c36067f41f33282a8548e5047d3d2da4c83483811ee3559bd7479216631281aeee1152f1fb876beb57b51c9cbf002ce9e6c81129a119120e24789958bb1de20448f01692ea4b955099b808af3c4dc7ad6652a9eff075f91fd3bbf54ec7d450c8000005894542b810974b36f6a66125e047dc491aa376b70aef9fd65379c0668937a86e0c12772520a151df018c031b931b2e0c0a25419f10080fa9010ddee60b4861692ed00bef79ab5cae1a4d5baf62552a111845c3969538bed014baac2169b2c6e847b3123a7aff9761736ba9e2f5f4d0f94852c921599615f91bbbdeb230ddf834305c9c70490307c300952b8e61e5255b31cd09f2ca7cdbb4c4e76798a78c0a8709d86c7dfd5dc008af596308a36e0d28c4ba60d68151858e740ccbcc068b0acb3fb81bea92e4e979ac39057ccb19c8603658efc62f6222621cf956b377b7ff0fea770908f04600c2720b03371a62ef941159fcc015248ba326f31d1bc82e4d94c186d4f6c39e1f55600221a2cdf85b560b78dc5fb3e74069021e9062e2e7c6173716ca70dc843cf02070253d31ddb9c4b569df4fe243b78a8300788104b575d641108510bafea96a25bbea6b8f6474fa1886de9d525a4fbdb480afc4ed96482ff2aa8e64142c285b11c87ffef811b5026b3a2587a91aff83c6825c4d0634ccc7aab85e795c11491f3e0883568c23e67efcd4c26a5db3ca0b5c3bbded3c6e355738319c1a087d8da87db4da52d4c5214d272cd1631b2843cbd6b015e52eb51a8bb759d529ae6ab7b397aa8963f2074c9278fa8499de47dc9152bb8726de26f5bbf24e9ca7e329353ca2da6363b4e00002710000000000598cd44000000002faf0800240a007eacf337b3a80941f2defd530cf824f13cd263ba2ca194e7170072ce28e8000000002b40420f0000000000220020e2eb1e4df160f9e11d4d06a6075034b47e9d3e1c3d21d0feab64905d2e6ab17b47522103174f3de90105ae02d88ccc1a7ed4bf0d116f27ef6010f1ec308273c1010ae3dc2103548b338f50bdae124711cadef7a82ce832bff61826f13b031677793abb8c674c52aefd0205020000000001010a007eacf337b3a80941f2defd530cf824f13cd263ba2ca194e7170072ce28e80000000000a1c4a78006204e0000000000002200204c81bcdcc2c4f01d3c045348a155c9249ddba4d48c16ccf33c1d8b6e34614180a8610000000000002200204c81bcdcc2c4f01d3c045348a155c9249ddba4d48c16ccf33c1d8b6e3461418030750000000000002200204c81bcdcc2c4f01d3c045348a155c9249ddba4d48c16ccf33c1d8b6e3461418030750000000000002200204c81bcdcc2c4f01d3c045348a155c9249ddba4d48c16ccf33c1d8b6e34614180a437010000000000220020680a82e78074810847ca530cd74fabdbd2e34beaf0fdd2bc832ddfcd2669876c00350c0000000000160014e1fdef3169db3728018a906129e3913dd841ab0f04004730440220639ddfeb4cfd418c28418208226f5f6be762b65bb242968695ac1574d1fae8e702207bd3b3f60f12f171a37e50b7126c709a4cb87e417efdfe520707962d393bd28c01473044022058407ee97260aa8020eea7036f348ec4959fbd8a820e8628244705138803e00e02207d53e7fec4e01bbc04a0495e8c31210c0c6c2542e38d6c9ae677b78bd568cedb0147522103174f3de90105ae02d88ccc1a7ed4bf0d116f27ef6010f1ec308273c1010ae3dc2103548b338f50bdae124711cadef7a82ce832bff61826f13b031677793abb8c674c52ae340169200004000324efa7874aa335cd976b8209145d670a6dba17471f6a4f47dacaa432dd972d801c000000002b204e0000000000002200204c81bcdcc2c4f01d3c045348a155c9249ddba4d48c16ccf33c1d8b6e346141808576a9144a2fe35d15fdacd3b3cba332b5879b6acfb2e79f8763ac67210375099d4e25580f8d2c59718d7319e9d26c7119f9476ca3a623fb638843d3c8617c820120876475527c210375f5c7f3e5f1da49febb149cb9dc97098402628f84b79b586d5d516c17e6327852ae67a914950b69c651378982bec084b296e6dd23a33c41b588ac68685e0200000001efa7874aa335cd976b8209145d670a6dba17471f6a4f47dacaa432dd972d801c000000000000000000013a34000000000000220020680a82e78074810847ca530cd74fabdbd2e34beaf0fdd2bc832ddfcd2669876c111b06004093d252d2f22cecee6c2b604a1190120db574f0ba33b49ac826229b95071230bd7a4baa7a1704813804ba9b7d0e2aef3932a7d7d096862c1636736ad3296a46f5401f096356d49cb9c0d1dad9a01530aa892aa75cdcb626f42ef09b734f39d0a2650d6274377598b29f3f3eae1281a8b61d5cb9853b478cc973b8035af5d60c26a0000324efa7874aa335cd976b8209145d670a6dba17471f6a4f47dacaa432dd972d801c010000002ba8610000000000002200204c81bcdcc2c4f01d3c045348a155c9249ddba4d48c16ccf33c1d8b6e346141808576a9144a2fe35d15fdacd3b3cba332b5879b6acfb2e79f8763ac67210375099d4e25580f8d2c59718d7319e9d26c7119f9476ca3a623fb638843d3c8617c820120876475527c210375f5c7f3e5f1da49febb149cb9dc97098402628f84b79b586d5d516c17e6327852ae67a914950b69c651378982bec084b296e6dd23a33c41b588ac68685e0200000001efa7874aa335cd976b8209145d670a6dba17471f6a4f47dacaa432dd972d801c01000000000000000001c247000000000000220020680a82e78074810847ca530cd74fabdbd2e34beaf0fdd2bc832ddfcd2669876c101b060040774ca3fbbee6dc29db89dbb2bdb977afdf31727548aa6060e9e23a79090bf658474a5aa2de53dae36371ec535e13e4291c9fbd1942e7cc812ff4ca4c9d84483c4088605547607e6c8b1b24a671ed340700ad396a8bf613fa9e4646c0b11c2aeff708e4448ba70fe48903e3034ace605d8651091fcd6f80fddb57d2e2b09da6765d000324efa7874aa335cd976b8209145d670a6dba17471f6a4f47dacaa432dd972d801c020000002b30750000000000002200204c81bcdcc2c4f01d3c045348a155c9249ddba4d48c16ccf33c1d8b6e346141808576a9144a2fe35d15fdacd3b3cba332b5879b6acfb2e79f8763ac67210375099d4e25580f8d2c59718d7319e9d26c7119f9476ca3a623fb638843d3c8617c820120876475527c210375f5c7f3e5f1da49febb149cb9dc97098402628f84b79b586d5d516c17e6327852ae67a914950b69c651378982bec084b296e6dd23a33c41b588ac68685e0200000001efa7874aa335cd976b8209145d670a6dba17471f6a4f47dacaa432dd972d801c020000000000000000014a5b000000000000220020680a82e78074810847ca530cd74fabdbd2e34beaf0fdd2bc832ddfcd2669876c101b0600404ec5ef779e7b0db022d9da0986bee62eeb0372337f3974e0bfa8ecbddec7a3ed47930ce5ca6796d3cde21dbf9e0678f4d0af5d84889c24e2b960786d141b900a402c736579e487f2ceedb15546a438818e9a13d3b9f9232d4ff418855f9112795e2bce08fb52f8737268b616158eeb06e36abdc83942396fb407d3e603ed1edd7b000324efa7874aa335cd976b8209145d670a6dba17471f6a4f47dacaa432dd972d801c030000002b30750000000000002200204c81bcdcc2c4f01d3c045348a155c9249ddba4d48c16ccf33c1d8b6e346141808576a9144a2fe35d15fdacd3b3cba332b5879b6acfb2e79f8763ac67210375099d4e25580f8d2c59718d7319e9d26c7119f9476ca3a623fb638843d3c8617c820120876475527c210375f5c7f3e5f1da49febb149cb9dc97098402628f84b79b586d5d516c17e6327852ae67a914950b69c651378982bec084b296e6dd23a33c41b588ac68685e0200000001efa7874aa335cd976b8209145d670a6dba17471f6a4f47dacaa432dd972d801c030000000000000000014a5b000000000000220020680a82e78074810847ca530cd74fabdbd2e34beaf0fdd2bc832ddfcd2669876c101b060040ff0a3853c07d426ac93a8b772017a41f324558851ec69bcd65ed1cd81490e0f11c3c01574fe196df6311cf21fbb78abd7d40659479ea080c7ccb3c5fd53027df404f63e06d948b7890c8a3fb1ae568e88de8cd4ef3364c092bcdeb006c40558b082a5fc572f9f02f5d2a0870101ff7d900da184fb19b5cd410ba0779bc55533c4a00000000000000070005fffd05aa0a007eacf337b3a80941f2defd530cf824f13cd263ba2ca194e7170072ce28e800000000000000030000000001c9c38077c3e8caa53f1a775a5e89b1a54488aff835593d5e2b7355179136bbdd10a86c00061b1000031a12d4e5b7253515c5822879f6f1738224e451910cacebbb545aa637e2a0f631a151e02f206b6397055534bd6a0b7c7990d269d153d3886fc7e51fd4e09c5357a96694911e9912135e3f9ccec1058be709a743ee44f07feebb0fc6a3078bec155a1b9f67afaac6914debcc890fd86150d790f8de1b7168d4501064dacfd16c19f61a8c13c7658df92d6e5ad79b1b251a96db66bfc498e8e4114f98b9b36bc41663c9d2d15a280fdae479c14e52e148b0f86abbe4f9ef78570e193585b5aa30e53d54352eba5ad54d238f0d756b54aca9889fb21c57b6c639a6713a4f655d5dde92391185a9d8c929bca42c3bc9ba5f65b059dcbab02e89cf2e95fe1b1fb291aa1c2aeb8b57ab24f92414fc296a37b683a1d47155acb5210ffb6a170642e0f1cf7a4704861099b23c0294f367f28bf6fb6f839ba3e958ba6954ef630f90d014b687e63decc26c395601a885583ee0f1a86de5d60069664e2b93a7e936579e934a084b3e34850a1c26dc5fe7a8479278e6000f5025552b0d43ec186cd01a4d6ae748ba9289d39046c3568982aac9593a3496d3eec561b538a9b0d9ed91a4560f504174bb70725fc1c9bc354afe11d1e8aab3389774d619fdff96ea096c8283c2555e9d3169c8dd543bc74eb9f3dd4f17105563922aa18243f7135429b7a71368b44975e07443fb6f5eae089b88dc2d729d87e303104b8a7172902cdb8500ce9cd2086f7a7f6ce683942caae21ed05596c46d8f87f98eadb034c472a3f6b9d7a83d41fa70b44beb4288973cee486adc191a9aad1d1b7cebac6225aec67eed51c347fa5c145e183454b2a514a5044808eea8a9b28b24e39b115e2faa75f04d370285684857129e14e6726bb23aa0ff9323e9687578446868705f3137289c49357ff4acb134f6f3f7dc7efe6b6a332cd2fbbef0579493c4368b70815ff13abc1e3cb08c3931d8b7c99bb8b5e89fccda77a6d51fee07754332500517b75bd26bc66c81cf9f0e8a34e01c700b86590fa1cc7682a6d20c10d325d735dabc43db87ae2700e4966d8be90e408aca19ba1327ab209d4a574095e37285880c31cd631aabafa6b6c31b6db80b989ec57141ab35a5d7e32445f153da3832b223831bcaa8d1cedf6cf9d8e2dc121fd1b8a744481690be8668d6185113853ad1e86fbfe5a1b216208d3300532b0c80bc751d805260f1e6b014fe8f0b904a54560baa1b9f9d81479024b9d722fa577d9708eeb5b84c5005766f2e2c622689e1d750dc16ddd74450fedec590cb49014d4cba6dff6d2aa2c15b71067c8c02128e587f6a09556ee2e8e6b1b6bb8380ea6e79f43fb6e427fa66f0b616b84261b18f07d3607eaf4b932f38fd7267c742c503862458a1d1f01b239e94f39bcce1864564ce2f021fd43673964e77d3616bf8405b4c770996fa48d312458b29be5c05a6941ce5b3b2ff4ff32ad784ea47a664fbc2bec22fb6faecf928539773cd5c0972d9e6a10762a66190c3b5cc9b77d3546ec02d355aeec68ca9af34b2f8c44071b6d9b608f17e24ec3ac185cd9fab9b9bfdfb7873e748796af1b87820707752798534334b0e79bf108d60ef61a2c3cbdffc663b54f2ef407ae43749d31681e3da13ab3beb1f4ac2053cc7286bd7a3192ca412d1692ddcb1fc33131c19bc312d72b1616b91110fc15a8f33b2429eb0fd07bb034405bb879e54cf2f4331c2fbafc69cca8c2ff5a762c7f139edbe123735e63490a17f309ec895077731e5f6d6a53e513f1a3c15eaf72db4605d65eaf5cdc830155f5b9bf4e96a3644dd0ae9ab1f09778fdcd763668507d1c49663dc4a64def5f24577d2b1b34113f6a2a92999bcaf649536e431b8c2c30491cb54fe84b7e087c7fdd1e9b92dfaa31651138e7602602a45d331528ebd79b450ea237b195e80a04a2261a00fdd918cd0b0116f9dfffd05aa0a007eacf337b3a80941f2defd530cf824f13cd263ba2ca194e7170072ce28e800000000000000050000000001c9c38077c3e8caa53f1a775a5e89b1a54488aff835593d5e2b7355179136bbdd10a86c00061b100003d4b11a6510316810f0248ea0530220e3255171fd5fce2eee5d0bff33d694904b77c108bd2c322ebc2c3231e1f78618ab9ba83f81fcbbc7278f4d0cf17edb4342ccf40ba133606f6597f474b0dde594a6f8af078aadcfc940d5fcccd32793a1266190f06e55aec9b95b9f2e552ee8d5e4a662a7cdddb20599b14e3105699f2618395ca9d80ca232f5a96e48e27a09b24b3c28b38b42bf63464dbfc0d233c635d1379784581f5ff2f2fa2c6dff4cf8c12454745c695ea394d0fc477f4907e82e636e347306ee70730f61aa75ddbb10cf023b28a5e1f7dfed48470bf4b3180e343ea7f578a0d8f33505aa36b3875226b668376db40b3171f5a2eef326b0a416fd27cd7c7936e71cc9822421d9e317db5fa31de68f4be412666c3ef4c699acbadf94d2bfd1f32ad1f962da04965d20d783047a415f5f6a59117422dc26c5f05a5ef0180081e9b7771277ae8520647e833c2dc80149baea35700c35aadce8c4c81ef6e3fc3ec55e3fe3b9f846710fd648668ca3ba05f6b7cf5eddc9b5a7e73f2ac4d1f53864765cf70f55128ec53692bf26656da9468ea93b7030063a2021ad57cf3ab1df019c21118f6f9cec64def026910242fc4809d2224210460d63d02f2d6475b371b97907cc3c1e72f56ce8285cc08fd4e37f439f39b63667c045f4b5dc5f982cdc8b32fa0392ce38dccfa6a79f5bcaccd2bdaae666404947fd8b6d8ad7e16ae1307d7b24cc15d712814d1311bdf2155ee28da446ddd2bd0e782c225a8a379073314ec486aa2a9dc54c4edc2e2dea278f39ee23b0d7c2f5df7a20ffe5d77541d1c42a94a17e977763f15dd889c939104b691553ec8c99d5c87a9513553a7384e3a45fac0193b77fd8b7a2c5bf291a6954c767addeca4c91a04946688491c56818bb9de51d2e2dfc2c0b2e8f3e929ba04d9b3f457935f8c797dd770cd6558b6238ba0706a500bd9aaa17565a8a8b8abb41e4717f312d9b449de7dcd5317e1f6ba71b428f5e96857fc9acaef6298d4e994746a45534715af1326c79836f0f3a7ae3aaa41c90f172ec8544d13086237420207fddbae7d349a2871a62f465a6c57bb54e623c36067f41f33282a8548e5047d3d2da4c83483811ee3559bd7479216631281aeee1152f1fb876beb57b51c9cbf002ce9e6c81129a119120e24789958bb1de20448f01692ea4b955099b808af3c4dc7ad6652a9eff075f91fd3bbf54ec7d450c8000005894542b810974b36f6a66125e047dc491aa376b70aef9fd65379c0668937a86e0c12772520a151df018c031b931b2e0c0a25419f10080fa9010ddee60b4861692ed00bef79ab5cae1a4d5baf62552a111845c3969538bed014baac2169b2c6e847b3123a7aff9761736ba9e2f5f4d0f94852c921599615f91bbbdeb230ddf834305c9c70490307c300952b8e61e5255b31cd09f2ca7cdbb4c4e76798a78c0a8709d86c7dfd5dc008af596308a36e0d28c4ba60d68151858e740ccbcc068b0acb3fb81bea92e4e979ac39057ccb19c8603658efc62f6222621cf956b377b7ff0fea770908f04600c2720b03371a62ef941159fcc015248ba326f31d1bc82e4d94c186d4f6c39e1f55600221a2cdf85b560b78dc5fb3e74069021e9062e2e7c6173716ca70dc843cf02070253d31ddb9c4b569df4fe243b78a8300788104b575d641108510bafea96a25bbea6b8f6474fa1886de9d525a4fbdb480afc4ed96482ff2aa8e64142c285b11c87ffef811b5026b3a2587a91aff83c6825c4d0634ccc7aab85e795c11491f3e0883568c23e67efcd4c26a5db3ca0b5c3bbded3c6e355738319c1a087d8da87db4da52d4c5214d272cd1631b2843cbd6b015e52eb51a8bb759d529ae6ab7b397aa8963f2074c9278fa8499de47dc9152bb8726de26f5bbf24e9ca7e329353ca2da6363b4efffd05aa0a007eacf337b3a80941f2defd530cf824f13cd263ba2ca194e7170072ce28e8000000000000000400000000017d784077c3e8caa53f1a775a5e89b1a54488aff835593d5e2b7355179136bbdd10a86c00061b1000020b7604aeb7cb080b12de62f75a292bed3134b4a3de764bd032fb049e2c2a1d3942cc11b9b12619d42cda3c7eb63da952644a3f355bdf772d77f1fc2a0b36bf116cdacfcda3b77974536cc3f3d0f8209dba69408073cbe0f039eba220fcf3b0b96d5875bb71acdc999fd9feeab68a0b63629efe0dc91e92dcf93b3c49285c981746a68ead7a96a9c1ce21284a2796b0051e6b7cf36a264d545063c054454b87cc3f9ddad5350382585de18cdc4e65e02484695f541b8fc082c87ea4a56aabc84fd1b7c1cd40e3517ae811f9ff921fba672e0191c88a2681ef8ea1300eeb6c1d8fccdb5ab05bf80b2a5c3ed5c018752cc841305edae02149389bc5e58ea5a59a1c59755c7ab5f35e3740c9f6218d227370363a7e386b214f5b2e771ea8b94a2a5e640d8a715d57756665f4a659f4ef6488f9ceab5e22d523ee52da368701d799fcb3459a31e6fb03de91ffd9b608656b172945015da3e5000f7f6c3dc0b4e102ba5f101bab5c2ceab8021d071bf89cf9d65d2439fe9a9dea4291eccb43a431904313655391ace4b82bf5da6270eb5bc12a60a69e7cf96b75a699db5a374713558eff7101bb2d8471e0c4ad0e202fd10aa46098bd5565c1d410e695fdd799c866090f1a7aa002305388acb68c8d82d588c1a66df5fb12653686bc4cf487a3484c0c23578a428de3df57539ed11227f2648bc36261c7f3f4f13e18d238dc856b8dd8f07de9fb73663d3a0026a03d9ee9f807e2a03c9546d2537a1f30a1f06767622d8bacdf4ab3b0f245a7b4f482baa60080fce3e7e15d2e086c670d6ec11d907e3da593977c8c25d620ed40cf82dd503c25f1a5f3e8a5ddb65ae7117600794844252e1448d17849028bd5df960a5fddf56e48cf082cfbc5c29666bca6af335c06f8240912a311e6c07946eeea9ef57e46b3e48b95c82cbee3830bf2b55d5e0223b9480fe072729a8af4c6c8c2f86038cb8a2e02405ce5f834c87b241fcb9963f008c273c64bc1f7289cc3a0c5eea7ea1a6dc7bc6228a97978a2ddd7dc49303c5beb15b36c8044f656716cad0a62d1e8c381db46f007be7f8096f72d3a8f08d338d9f2bbc43c0244215df229824a9ad34b655d840b38c5061462d54358be1c184b51d3a805beeea78047f544b15cc333d591f3d8cb60cbdd78e58ed47d21739762957ed6365fea14d7ba8368371fe4333be4f5ae289ff444c9f377a072a3a4173bd2680c6d6074743908d9c4f09aa30d064c7866a7a34303fce53deba6a597a24c211d209815bbff97736ba9fc79e390b36b2343d2590c8fd6db3e54206580eb7a53b9de09a42cfaa2cffb00ea90dbd07f1d357e69ca96fbba4efefc4e07b1a1a174a9a8a5568c0ec9a9487add3890a20391eebd69a56c4dd1a7c7112766b05d29fcfdd0f60d8c3f7287ec070201b4d0200e3ebbf47a97c230a7d2f05b25bec59cfd125f6cc15529f13fc624ebfd387327119434b66e61a8446e9fd9e14f4e0a42cee83f4600b195a06f4f0e55d67239c55256db69c3eb5218f9d214e0d9ca0992dee76630b55a96136a251a84711096475028e326782112f2afd64c3795f438ea623754cb0ea5e6a0d4e1ded7ee633f1eb8bf71b791646c8953e54a07242a178c02baf8fc68e7c1d3e6982b265802f50353b7f1eb0d8f33c9aed1b18432ecd04d10f951473a0e7d7e3e88a3cfca46ad1b11c5abca59bab0c8e880519753b9f4a9ab4f7a756d58a389dc3bdb25940a71a03899125b08efd7ec85b3cf0c1577014a81bf63b2144617cf259383a41af2d50a7ebb7d45a8968e3e3edfb1f4a45368ba380d172f82e641eb16949e192a3c2a37117df8e22fb7a4e7ed425f9951b392bc59184db81899ed2270844446a29aaed5cb3839c392d51636a24b737a3100417a849104c08606b4644a785080b67a92dfe888cd9871fffd05aa0a007eacf337b3a80941f2defd530cf824f13cd263ba2ca194e7170072ce28e80000000000000006000000000010c87c77c3e8caa53f1a775a5e89b1a54488aff835593d5e2b7355179136bbdd10a86c00061b100002a9a1e8cbe48ae54ff2f32eb81ac70966e623abd77532a8cef6c3dab174da1e2879020c2238504e525d2d3fae9adb39044e8e6d0c394ae9e6ff1f01ae21e354d0bd1a5970e77015dbb6a635157b6465c32aee891c26ff8942ccfd24b612e4df241c55fc34dc1a5a613d431b813e14d0ad78023314f93c38f2bba6a6ea6e642d59a547f97b306ae0d072944c62cdec15933ffd85dafd9cabf278d9b8121db56915075baa049ac0d47df8a32b6c54a9935fbc1284fe8af288d3dd72870c8faf77e34a20970bf44b47bda06f2b8bfc931252456760ba1fa58669a3ec443737b429095db43f5bdf8e5d7f2d2f9c7318cfe012213ad35d54751539605337143de28756a146779a41308dbf94be4c9290422cb79ba768c340bc91012488afc3b388fbc253bdb9a35b1f4e39307c89f9ec3bb58e5da660013a741c1ab6c0cb22a3c94db0bf6d207599a527f18831530179880ef00950886378abcb99d2d1502b874669fb8f0a596ce3909e314057d7d1f668ca80e23c46f86127a71a729021623038d23cba281ed4967ea654470d4fdb31b297def0d22f5897f58d28af0cd86287fa51722af2682fe259987f56a9fe74af94138bb520ed12bd86453cc44f31f00e337647997b56c8bf40e3e9233e42b4c4ffe2ccc438417c754e04c95a2e7f357eb238020a0b235b8757a40996b6dab0e09e526f891f1773153151d99f3f65e62f0db6d4d94fb18293ea2f13e8c900d575cc0800969ef1e6903e6958c02dac84a8e863bcb8226bd3c6bab1038b628661333449d801b8b739bb08e09daf59c969691306e9e09c68508c5a558708a9b138fb841906a1967ea6290198be18ea3941a72a95b1b55e38403bda57d391cfdb86db844a0d9b4762a550cb1d7010de80fd6507d1e2dc7830ccd49784f8e80a3c87d9301339572b0347db9336bb7b1ede0fd1e187ca94aba942fe2b5c230f7dd1d3d0376aa882136b112883999227e2be17e9d681fb813acb70807b47e99bac127ca67c2d9619049783f8a9089d3fea4275585533683308ab94f3f02f577fb840ffae279813439fcb30eb5874329c48160768c2ca6b5d6368775989b96a056f22f7dddfbcd1b22a7fb74bb2d1b36f3e94914b82709a9351e1be88364a17a36b2a92ef61bb0520fefb802393b9e9effd6d54741ab9c6dbf28911bc45b334d9c2a6d76d94ecc2a19a3115d0f2b5e5ddb1f29fc9db0b3a21651afc2f93d321189621d8b59ab07e8d4e348f4bdbdb25b91d19b313850afddf92300c7fcebd9b266792745a24a505c56a3f98428ec70b65b0396a46836cabe49024d382eb1c8227e2df4da21385960f3d3801fb63d73ae69a4fcb6aca7018e874e8bf44f73c5e845ce81b2c643862c0344e3f4e50f4e6cb51b53a6c90ea545bc897dd73e2d2b3250711ed2a666413ae85b22e848735e8a6306e3b80f3677c8f40f85bf2f457f7764343288530a9c58b160de657df482af5eb0f291a50071d207cf46969643c113a6b15354b0b590885fbf4a7136939463ef66e013cb794ac6ab0fa887352817827ffc420bd8d1ee0b6a04d6819eadc1d96517c2edd8fe028101cd9842e407a44a8eb6bbda3fc5c54997fa43aaf340ed8ab6f75e3b588dd906ebd9deba889711b3895bd7df494f042e68cd78d7e75c237bd22b90e49e5571e169487508dfea22bfe2c83f21ec1e91f7d9331e5ac4ba6c52c1183afb1e083f3d0c42af6cf41e82e9151b5717b934ba6e4f52757d27a7c8139c523f977cb9c7f29e4a19cf41a1288c60a9ee10f58189351a51925422276e2da9ce3a4ca6944b767601e686745e88b7902e0e110dd66189dec74e3abbc76a4045d5051a6b76c91b2b20fc2ab1ca7d5d63f25d2c83f5d8ab31034e3ca42c4af1ed6017f5b10c2f44a52d78bf858aa7c148b6f07156ee365cd463d3cfffd05aa0a007eacf337b3a80941f2defd530cf824f13cd263ba2ca194e7170072ce28e800000000000000070000000001312d0077c3e8caa53f1a775a5e89b1a54488aff835593d5e2b7355179136bbdd10a86c00061b1100030159105c3e04b59668b1516a793628be01d018e0de5972a7e6094a8b29761bd07a1654dc17ab21c8f940806cd4ccfd904db9594a8170f310b1e2d95e0e8b0baab7f8484c2c66a91b7f4274ec9e5cc3651ef2ee3a0177281548905a3c7d03c4ddf2bf8b736a940d69f2a5e6beaea33d92ce189a96803654a52b0d3da0cbdbbe0725e64dc4a6633f33318de0f6ca50b9f2a79ac68fdfe3a6f6c01a5215dc3bdfb56a780dc17968c5afd3270c50d4f7e1f540364e184d460e8b8479719788023ed029ad1439d0a0c85570b7a3f50ff70a82bd9ff9c04d6d8154046a30a3606ce25c2fbda28c863109cfaa95b7fe4f96622c715422ed1a8e99ce5bdecadb7c39798822115215e3914409d5de1e2c95a6c375c530b27fd0263d02167eb28628b945280a668f88c607bd74e3aac0ac704dfda9e796a76e6a856aee502b41c6f3932b6a89425484d580b6abc232cb12530b38b5c20cbbdcb0357210c3ad09a3ad7a56353dbbd6087f7cbccbae1f656ad06d370e4ec5a7906c9841a1f36f24ba6eab5c70b5d66bc8aecb60d9feb4576ef33b23456332483f01fcd0e01477789448ddc20fa207f496db56203fdaf53f6d64d97153d8e8c8c89c821f526f4b376e929d7598cf368b826313eb0ac5e435097b3f4acef26cfb30e63ab70622ff1ed04f9a1c02074bdb2d302d932cffbba4f833ab95912272ec87d8c05a8c5f1b2b101fb78a75cf9d0ab6e751163f27018f08c2fae76c7a6a417cf5cae2cdbd867115d9c1f162e83c3fc4f52202d3471212c3ae6eb39f882aa322609958dfbc8ca3f3a2eb051ef1b43d452b54c2352e8c9d184cbbd46ea936161067893164a72a34f6e2fd63c94353e524c9db699d15cef86f970bcf6a92dc367152f9740e84b2c292dbb338e4f21e6a47171b5a5cec0f4026906b528ad2c115866fb9e807faa200b600637abd774148f7637789946a82ec5c8e35692470c0c0f12a6a39a0c5dddf73635f2dbbb82d9ea56d8313a25cfd879ee024ee5144817b1f96945f34632cf0a5a3dd3ebcb8b42bb6c4b1c3d2a7fc6f817c97ec6282a3981a8d9e3d7070c178f7df847fcec8013b0a0d07a4f8c13c829209172022e0d724caf5a01219575f1d5a26f50f53d72ef8b596ae2263d2c2eeb822166178d56eba9ee9a9c60adb4fe3a7be89044d34288c7bd59cbf6e88e01f971b687200fccdc68d5a21f8430a8e5654a17f05773b2254eb301a5624c4aadbd3db8641cfe866ff72424a891f5e0487a48c204870c932ed9895427ce9a3d0a183fc40b7bbea3617b321f35cbba2c2180908e9bea2e07e1e5d8d5de9846994b78a313b8828eca935f4bdf9ca861326cca20776c6a4df35eeee257899467973941e6e8c567054480a7d8077e6e61ab480562ad53ad8127874a7fa4f747ccb2601cfa6e8c43e89f678dd38e4df80adef7bf07149edd32bf0e9775f3478870da6af26709a5bebbac77018050a07f1a8ffe4539c2df9de1dfe18c9bf0aa640178b0912bd9631acebdc2f2f993039b6cfa414d5cfcd0c363a178443e954db312efcd4463ee7cfe0d8a1eabe74d47692653f996cdd9b93c9fad41c5b16aa91a7bd5b267578a537e45d2af048ee0ce09ea41c72020d61509e5e91575022e7d5956b8e680f229909642366d5a16a17f021f41ca3d13df75ac3d3c8c772c2ba042680ba81466f8d05c07e19b1cde5a4d27ba6b820a63fffc5a42234e18109f128cb1e3524d621e38855b5c11cfbe7edf25dc3cd470308971b655b3381f946531d89ed23ad24f6a3cacd022fb9e5eb1d5a188a5d0936d0dfe3c7c424dba5f8892b2adda87a171d73bb5c5b8f809812689794ee3a5a7dc7d80f9c84bdad2fb7f89b2a45dc25836a42c8757eaddabcab7f82e1e51502cdcd3c4745009c55fd70b1c8f1a748e71e2b96b312f71f21cb00002710000000002faf0800000000000598cd446da1a38c05425e396afcb5fbb37ea2a9db15c56121e2fae11ec9f06da63917610371ece811f4d34713b42d65c38a775487c71c193a52df6ac46d6a013164681dd200000000000000000000000000000000000000080000000000000000000500000000000000050003d6ec06b2431d4e1f9c36a610af90d6c40000000000000006000317def351ac5745148ba3275aacb2b68f000000000000000700035d913d0e286346e1a50fe900f618b18600000000000000030003c35487d4d1e24e38bb4f923885d19b44000000000000000400030c7e6ecdbccf41baab2f7d95ca9e5e9bff03d32570a2783f1792d20fbe141f337d5dded9509c875e13288fe140400f36560e240a007eacf337b3a80941f2defd530cf824f13cd263ba2ca194e7170072ce28e8000000002b40420f0000000000220020e2eb1e4df160f9e11d4d06a6075034b47e9d3e1c3d21d0feab64905d2e6ab17b47522103174f3de90105ae02d88ccc1a7ed4bf0d116f27ef6010f1ec308273c1010ae3dc2103548b338f50bdae124711cadef7a82ce832bff61826f13b031677793abb8c674c52ae0003003e0000fffffffffffc008030b0e83d8813791baf507a3c85c55d81cf80a50fd9f08504260743bb8033212800fc0003ffffffffffe80101460f774080d0e1bad18203f9af025451bfb4b8de611116890dd1fa45dd0f8e9802000007ffffffffffc80104c31735de0c70dc61744d1123646e49d871b662ae090c568a3ba7666fe370ce0c0003ffffffffffe40a007eacf337b3a80941f2defd530cf824f13cd263ba2ca194e7170072ce28e8000000000000061a8000000000fffd0205020000000001010a007eacf337b3a80941f2defd530cf824f13cd263ba2ca194e7170072ce28e80000000000a1c4a78006204e0000000000002200204c81bcdcc2c4f01d3c045348a155c9249ddba4d48c16ccf33c1d8b6e34614180a8610000000000002200204c81bcdcc2c4f01d3c045348a155c9249ddba4d48c16ccf33c1d8b6e3461418030750000000000002200204c81bcdcc2c4f01d3c045348a155c9249ddba4d48c16ccf33c1d8b6e3461418030750000000000002200204c81bcdcc2c4f01d3c045348a155c9249ddba4d48c16ccf33c1d8b6e34614180a437010000000000220020680a82e78074810847ca530cd74fabdbd2e34beaf0fdd2bc832ddfcd2669876c00350c0000000000160014e1fdef3169db3728018a906129e3913dd841ab0f04004730440220639ddfeb4cfd418c28418208226f5f6be762b65bb242968695ac1574d1fae8e702207bd3b3f60f12f171a37e50b7126c709a4cb87e417efdfe520707962d393bd28c01473044022058407ee97260aa8020eea7036f348ec4959fbd8a820e8628244705138803e00e02207d53e7fec4e01bbc04a0495e8c31210c0c6c2542e38d6c9ae677b78bd568cedb0147522103174f3de90105ae02d88ccc1a7ed4bf0d116f27ef6010f1ec308273c1010ae3dc2103548b338f50bdae124711cadef7a82ce832bff61826f13b031677793abb8c674c52ae34016920ffed02000000000101efa7874aa335cd976b8209145d670a6dba17471f6a4f47dacaa432dd972d801c04000000009000000001c62401000000000016001401396601573e7aef81f91a89fc4b4b56feb7a35e03483045022100c787b74c895285a11e04a680a50cef980d74a1ea53998bc2abaa2f7e13b6131b02204e0a8216f2efe89880feac989f9b0cfbf6aea1a61444d453d5547060aa65cc5901004d632103d6a391d54b9683da5c4c1ab1720739757422861b7ca98da226118061b40c412e67029000b2752102f2b77c73154588dfa6301b6c69062c0a713467996542a836f7a2ce6a239ba68868ac0000000000000004fd017a02000000000101efa7874aa335cd976b8209145d670a6dba17471f6a4f47dacaa432dd972d801c000000000000000000013a34000000000000220020680a82e78074810847ca530cd74fabdbd2e34beaf0fdd2bc832ddfcd2669876c050047304402201f096356d49cb9c0d1dad9a01530aa892aa75cdcb626f42ef09b734f39d0a26502200d6274377598b29f3f3eae1281a8b61d5cb9853b478cc973b8035af5d60c26a00148304502210093d252d2f22cecee6c2b604a1190120db574f0ba33b49ac826229b95071230bd02207a4baa7a1704813804ba9b7d0e2aef3932a7d7d096862c1636736ad3296a46f501008576a9144a2fe35d15fdacd3b3cba332b5879b6acfb2e79f8763ac67210375099d4e25580f8d2c59718d7319e9d26c7119f9476ca3a623fb638843d3c8617c820120876475527c210375f5c7f3e5f1da49febb149cb9dc97098402628f84b79b586d5d516c17e6327852ae67a914950b69c651378982bec084b296e6dd23a33c41b588ac6868111b0600fd017a02000000000101efa7874aa335cd976b8209145d670a6dba17471f6a4f47dacaa432dd972d801c01000000000000000001c247000000000000220020680a82e78074810847ca530cd74fabdbd2e34beaf0fdd2bc832ddfcd2669876c050048304502210088605547607e6c8b1b24a671ed340700ad396a8bf613fa9e4646c0b11c2aeff7022008e4448ba70fe48903e3034ace605d8651091fcd6f80fddb57d2e2b09da6765d014730440220774ca3fbbee6dc29db89dbb2bdb977afdf31727548aa6060e9e23a79090bf6580220474a5aa2de53dae36371ec535e13e4291c9fbd1942e7cc812ff4ca4c9d84483c01008576a9144a2fe35d15fdacd3b3cba332b5879b6acfb2e79f8763ac67210375099d4e25580f8d2c59718d7319e9d26c7119f9476ca3a623fb638843d3c8617c820120876475527c210375f5c7f3e5f1da49febb149cb9dc97098402628f84b79b586d5d516c17e6327852ae67a914950b69c651378982bec084b296e6dd23a33c41b588ac6868101b0600fd017902000000000101efa7874aa335cd976b8209145d670a6dba17471f6a4f47dacaa432dd972d801c020000000000000000014a5b000000000000220020680a82e78074810847ca530cd74fabdbd2e34beaf0fdd2bc832ddfcd2669876c050047304402202c736579e487f2ceedb15546a438818e9a13d3b9f9232d4ff418855f9112795e02202bce08fb52f8737268b616158eeb06e36abdc83942396fb407d3e603ed1edd7b0147304402204ec5ef779e7b0db022d9da0986bee62eeb0372337f3974e0bfa8ecbddec7a3ed022047930ce5ca6796d3cde21dbf9e0678f4d0af5d84889c24e2b960786d141b900a01008576a9144a2fe35d15fdacd3b3cba332b5879b6acfb2e79f8763ac67210375099d4e25580f8d2c59718d7319e9d26c7119f9476ca3a623fb638843d3c8617c820120876475527c210375f5c7f3e5f1da49febb149cb9dc97098402628f84b79b586d5d516c17e6327852ae67a914950b69c651378982bec084b296e6dd23a33c41b588ac6868101b0600fd017a02000000000101efa7874aa335cd976b8209145d670a6dba17471f6a4f47dacaa432dd972d801c030000000000000000014a5b000000000000220020680a82e78074810847ca530cd74fabdbd2e34beaf0fdd2bc832ddfcd2669876c050047304402204f63e06d948b7890c8a3fb1ae568e88de8cd4ef3364c092bcdeb006c40558b0802202a5fc572f9f02f5d2a0870101ff7d900da184fb19b5cd410ba0779bc55533c4a01483045022100ff0a3853c07d426ac93a8b772017a41f324558851ec69bcd65ed1cd81490e0f102201c3c01574fe196df6311cf21fbb78abd7d40659479ea080c7ccb3c5fd53027df01008576a9144a2fe35d15fdacd3b3cba332b5879b6acfb2e79f8763ac67210375099d4e25580f8d2c59718d7319e9d26c7119f9476ca3a623fb638843d3c8617c820120876475527c210375f5c7f3e5f1da49febb149cb9dc97098402628f84b79b586d5d516c17e6327852ae67a914950b69c651378982bec084b296e6dd23a33c41b588ac6868101b06000004ec02000000000101ea542e3a509a29b8d2afac84f21bc8f4e100df901b35c9fc19a331c588683519000000000090000000015c2100000000000016001401396601573e7aef81f91a89fc4b4b56feb7a35e034730440220359f29d38879b19665015a2b85bd60e4e3949292f75d2294d5a545aa392dd1fd022036aa2b42bdedd9deca319eece3e8a5670fe89e78231e1025b9fc1079a931398d01004d632103d6a391d54b9683da5c4c1ab1720739757422861b7ca98da226118061b40c412e67029000b2752102f2b77c73154588dfa6301b6c69062c0a713467996542a836f7a2ce6a239ba68868ac00000000ed02000000000101374c80d9d5213e7bf0ea94c3a8085866a4d533590d89f68e829162d03d431a2600000000009000000001e43400000000000016001401396601573e7aef81f91a89fc4b4b56feb7a35e03483045022100d486e826ecfddcc474b719cb69e641efe97b4795b8ea4bb9729237788a3d35ed022051b097591bfc53dc855303672e17ad8488de9f2bcca670995060f331a7dfe55e01004d632103d6a391d54b9683da5c4c1ab1720739757422861b7ca98da226118061b40c412e67029000b2752102f2b77c73154588dfa6301b6c69062c0a713467996542a836f7a2ce6a239ba68868ac00000000ed02000000000101a436af3ff69624fd11b543c0b8d451190bcb7891a7259832cb64445571dc3003000000000090000000016c4800000000000016001401396601573e7aef81f91a89fc4b4b56feb7a35e03483045022100c203f2093d4b182ba5b78a471f806acf13c4d44f7191068abaf2b7a6742f427e02200fabe2a24e947f467a48fca7bba3ed68387ce46c32533366d99a52cefb0e3ad801004d632103d6a391d54b9683da5c4c1ab1720739757422861b7ca98da226118061b40c412e67029000b2752102f2b77c73154588dfa6301b6c69062c0a713467996542a836f7a2ce6a239ba68868ac00000000ec020000000001013798507505fc7de865bccaad655dc03b3899bba86e139dfbc543a2a2f9b4b842000000000090000000016c4800000000000016001401396601573e7aef81f91a89fc4b4b56feb7a35e034730440220724b0e5a340e80de26f3908ae510a34c93b5632dbd539c1a155856cad5375ac402203de9139fbaadd86a11168c612b75f974a6143e68c564de77c8b350f2978ff2f901004d632103d6a391d54b9683da5c4c1ab1720739757422861b7ca98da226118061b40c412e67029000b2752102f2b77c73154588dfa6301b6c69062c0a713467996542a836f7a2ce6a239ba68868ac0000000000000000000000" @@ -184,9 +184,9 @@ class ChannelCodecsSpec extends AnyFunSuite { val negotiating = channelDataCodec.decode(dataNegotiating.bits).require.value.asInstanceOf[DATA_NEGOTIATING] assert(negotiating.bestUnpublishedClosingTx_opt.nonEmpty) - negotiating.bestUnpublishedClosingTx_opt.foreach(tx => assert(tx.toLocalOutput == None)) + negotiating.bestUnpublishedClosingTx_opt.foreach(tx => assert(tx.toLocalOutput.isEmpty)) assert(negotiating.closingTxProposed.flatten.nonEmpty) - negotiating.closingTxProposed.flatten.foreach(tx => assert(tx.unsignedTx.toLocalOutput == None)) + negotiating.closingTxProposed.flatten.foreach(tx => assert(tx.unsignedTx.toLocalOutput.isEmpty)) val normal = channelDataCodec.decode(dataNormal.bits).require.value.asInstanceOf[DATA_NORMAL] assert(normal.commitments.localCommit.htlcTxsAndRemoteSigs.nonEmpty) @@ -256,7 +256,7 @@ object ChannelCodecsSpec { nodeKeyManager.nodeId, fundingKeyPath = DeterministicWallet.KeyPath(Seq(42L)), dustLimit = Satoshi(546), - maxHtlcValueInFlightMsat = UInt64(50000000), + maxHtlcValueInFlightMsat = 50_000_000 msat, requestedChannelReserve_opt = Some(10000 sat), htlcMinimum = 10000 msat, toSelfDelay = CltvExpiryDelta(144), 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 545da0fdc5..2eb3aaa1a6 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 @@ -62,7 +62,7 @@ class ChannelCodecs1Spec extends AnyFunSuite { nodeId = randomKey().publicKey, fundingKeyPath = DeterministicWallet.KeyPath(Seq(42L)), dustLimit = Satoshi(Random.nextInt(Int.MaxValue)), - maxHtlcValueInFlightMsat = UInt64(Random.nextInt(Int.MaxValue)), + maxHtlcValueInFlightMsat = MilliSatoshi(Random.nextInt(Int.MaxValue)), requestedChannelReserve_opt = Some(Satoshi(Random.nextInt(Int.MaxValue))), htlcMinimum = MilliSatoshi(Random.nextInt(Int.MaxValue)), toSelfDelay = CltvExpiryDelta(Random.nextInt(Short.MaxValue)), diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/wire/internal/channel/version2/ChannelCodecs2Spec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/wire/internal/channel/version2/ChannelCodecs2Spec.scala index ca95bd323e..ffb3dec117 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/wire/internal/channel/version2/ChannelCodecs2Spec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/wire/internal/channel/version2/ChannelCodecs2Spec.scala @@ -4,7 +4,7 @@ import fr.acinq.bitcoin.scalacompat.{ByteVector64, OutPoint, Transaction} import fr.acinq.eclair.channel.{ChannelConfig, ChannelFeatures, HtlcTxAndRemoteSig} import fr.acinq.eclair.wire.internal.channel.version2.ChannelCodecs2.Codecs._ import fr.acinq.eclair.wire.internal.channel.version2.ChannelCodecs2.channelDataCodec -import fr.acinq.eclair.{FeatureSupport, Features, randomBytes32} +import fr.acinq.eclair.{Features, randomBytes32} import org.scalatest.funsuite.AnyFunSuite import scodec.bits.HexStringSyntax @@ -42,7 +42,7 @@ class ChannelCodecs2Spec extends AnyFunSuite { assert(commitments.channelFeatures == ChannelFeatures()) } { - val staticRemoteKeyChannel = hex"000200000003039dc0e0b1d25905e44fdf6f8e89755a5e219685840d0bc1d28d3308f9628a358500092eaee758da6a5beab04167c5b889732a98ec556cf92689da41744b10159ace488000000000000000000003e8ffffffffffffffff0000000000004e2000000000000003e80090001e001600140a46fc26a4ef7b50aaf16759d2f0ca8b014fd0a6028feba10d0eafd0fad8fe20e6d9206e6bd30242826de05c63f459a00aced24b120000000302698203af0ed6052cf28d670665549bc86f4b721c9fdb309d40c58f5811f63966e005d0000000000000044c000000001dcd6500000000000000271000000000000000000090006402a87d8f1844a3809284885b41cfc9713a561780b2b784a7a027851f68aaa838730328e2fd423323abcd86b15335ff44679068acd4db71b8052f63a2a7f0b47432bd028feba10d0eafd0fad8fe20e6d9206e6bd30242826de05c63f459a00aced24b12025ee0984b83efe2369c23c3754e89d19905f8094a86486de3b241cf8735208292031163dfd4eee879b9a333290cf10e52eb010d1da45bd44efee6fab16d1035120c0000186b02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000269820000000000000000010001fffd05aab125c87884677613fe191e097b3806667482e0ff7668c64bca637300fe02307200000000000000000000000002faf080a2fbf30338f78b739d2b0a0a806506d6877408a995791901c43f6ef98d8a7a2e00061b10000223bb38126f1131ad95b37e0b30adf0ae315f66f8cf7460afccba393fa848d036073b6577f39b0e54043691e2eec74f46b86584ffab7aa01d15e6a7ff5ff9d7c60d095c7952a19e263c267f94fbe0208fdd212b304fa8d3df1379017d184fbcce7ffd5175997774c9de7ef2f3733c7056a22888c9f302e4a9bac35f581d4f571a7ef29e6cf3b1d8a7cc05cd155a047ae498a18fccb6589338242d91e00493a86b2b78810de20644f0f065399894854bd7347927a0ce8f9c1102c9c7227ffba4b71c4325f301933397aa8f54a28d3844c71021d19b72795141af019c9a0abae3e2cc29033b7f8be8465ac8406d4c1d61d0bc3c87dee2faac4d649fc166917c81a1e237c91d5c8091f696a72241c67047cfcec893bb41e97753b3d362695bc31f776cd4a744bf09f2e428dc189fa4838f34d130d5fd4fc3d79bc7546d30d543ca99818a8c39f6c17e74ff45976c95fd6de261d68e2c5fc585d28fa9ae5abb1db475f24d16d9cb0562a589c6dec07f3b81a37b4c7f2c4642df1fabf5d7343e038706e786d2cea71f76663f57a88751287db3f8e9a7a896990374daf72eb776ee67c9ec61c1a10f164688ecbc88caa086e24daa79808899e3c3f6870ed326f5253fc038147774fa8795351f44cbadc53b67743822b89f27f0c03b2b0f4e4c774598db681cadde0e4e28f1f4edbbc8ec68649fe05e3c8cdbc46b07011c9b81b9cb3ad92ec08ddf8209a501ce064ee0bd9befce196c0c559cffcb3b0c447922ad50fbceb288037ec36abb17d93deebd40e83d8c197248b14ee12dcfe72e46f0826ef1e6e94700ad6428df77b54eb8ca767af1fd84507adc52beef32f48e3968c24d990d04cd8b35c87e270a04e2e8fc9d0ab6a6398c2168986321cc0dc297f8e0e4887226db20958e934bc35151de72d896511e3b850d548402a0e1f32fb01d5050a8ff9d7ba6818600a2dafa1c4b3ca11c0d091796190c05a1edc8146d7ef534d67bb39f76f37279dff6be5e053b7315c3f3406e9240c6b618b18545fccb46d668c007a1b640634c663bbd27c5d00a48f5c3702bac6202b55cce4212920be059ecf708db85f07c0fcc0f480fcd06aef1128fc491b2b384d89ce15120c81bd65c225d679f8cd38fb1b0ddb7d8edd3455506fa3406578f43ba4caab00593b6623b7b69c863409f0350b8b8783b9ee2ada9b9f410ab309527b7f67758f543261f52695da19e597f9457483d188e8a2bd7248a6ee5f2d01cccacd2561239959f0ce80cbb83503891a8b4e3ab88d3a02de5f8c784c0700e8bef68445615f25dd3d5baea34bc8e694a7282b054f99fa2b150af00ec62c2fd2227a23e0c0a36090b5986271f964e969cc9313ef42c3b7a9ff9e608342c73da023019e983ee6b6f630e12a02ae79802bfbee10ba20199895d7f1302d2c3b8d7ba6ad08cbb27265f9bb709bf6225a81bdabf7fc5fe9ee4794b00181038051cae0a52c08d8a7750ee46c99b7dd6cd452c52a347f12873dc697786b89ddd13e2d584aa3244cdbdb7809bc7a42728d756485070ff84aaba81b1506a7b20d2acfef11df724ee78e8b0f92376676d1e01aed7ad8d84919b8296684dafc152680b0f964db5a1b7ee4093f453fe24750c6857252e4befef3df2d648e32cc20c1ef48fd5865c242951cd359f92985680f0d626602f164b6285971a194a4baf4eb1d9a3e88841269b3e84a96e6784407f869bca5db2bb2d31e784c35e210dcaf5d3441edea9a4a348e3ead6c9b920e1ff8f1c76c41d564827cd3db006e741a8dbb5db9bdbe13033faac7e6b676bc1cf88677d10676ddca3e187caeeac52b69212503f7acca29a49c699d68f0d982c4c41806c8d9bbbc4e7d2d77a1a0655c73cfcd21b93d95e70d2bad6c306dc172b67120335bd2d03878b3d9e5967c54dd567d307c15e305b5200002710000000000bebc200000000002cb4178024b125c87884677613fe191e097b3806667482e0ff7668c64bca637300fe023072000000002b40420f000000000022002090750411c84891017ca3ab8e6212a198dbf957143d6753f7b48264c7faf45cf44752210257f2ca56049071462716385481d04d3c7c859d7e9b3f31c019b126aa0eeed1e82102a87d8f1844a3809284885b41cfc9713a561780b2b784a7a027851f68aaa8387352aefd018602000000000101b125c87884677613fe191e097b3806667482e0ff7668c64bca637300fe023072000000000036a2ab800350c300000000000022002042ee833f99ec58f28a3ffc13033c29d4e02f72f6169e0e8e039ad9323e912e30400d030000000000220020981c45edf62e238461337b25d5fd7de72a305e7f4c7755a693f877b1a564831cb04e0b0000000000160014761879f7b274ce995f87150a02e75cc0c037e8e30400483045022100dc11d7761cdf7c708ea2aaaed409a4d24697bb07948704e77b7cbe911d0268fd02204a81721e85bb1ff6cb34741ed5c5ee89c4ea8f5bb1515792625d32043682c14301483045022100af2d760500664483ea81ccaa3bc925c5587cd3cd4358ee27110f62929903c49602201ce1a97498227eaef1ab5c04da2eb9ea8114abe6af1bd35494d9cbb0e64da3e7014752210257f2ca56049071462716385481d04d3c7c859d7e9b3f31c019b126aa0eeed1e82102a87d8f1844a3809284885b41cfc9713a561780b2b784a7a027851f68aaa8387352aead678920000101241bfa1a637efc49b76b41be6ec36c47c546f69b1646a11e8420957a1dbf731487000000002b50c300000000000022002042ee833f99ec58f28a3ffc13033c29d4e02f72f6169e0e8e039ad9323e912e308b76a91420fe4794a7f993489c0477c442fed3be2c9294678763ac67210230714b6385889be70b5299603fbc508a01517a3b754d03e33e5bcf125104adc57c8201208763a914e5a9c4cf993e5053ca47ddd2a194a3c522c1fdc588527c2103bff704aae937cd0b98704a4791140cab835c5bd2406897104602c881352869ae52ae677503101b06b175ac68685e02000000011bfa1a637efc49b76b41be6ec36c47c546f69b1646a11e8420957a1dbf73148700000000000000000001daa7000000000000220020981c45edf62e238461337b25d5fd7de72a305e7f4c7755a693f877b1a564831c00000000a2fbf30338f78b739d2b0a0a806506d6877408a995791901c43f6ef98d8a7a2e000000000000000040c5c678fda30c1e23bbb68093b1d9a34169304ff3d36bfef74157f129df8d01e31ddcd8dd04f3ac9521ac13b7fed5d7997ce0c72c942054711d924ea197c7ab7640cd0045f41ffd38fa637cfc09679c628b29a8273223db1150e262d5159cf5d7852542c4ad7334f67d08ca835cd5b16b1df96544c454dff121856685471d2255300000000000000001000100fd05aab125c87884677613fe191e097b3806667482e0ff7668c64bca637300fe02307200000000000000000000000002faf080a2fbf30338f78b739d2b0a0a806506d6877408a995791901c43f6ef98d8a7a2e00061b10000223bb38126f1131ad95b37e0b30adf0ae315f66f8cf7460afccba393fa848d036073b6577f39b0e54043691e2eec74f46b86584ffab7aa01d15e6a7ff5ff9d7c60d095c7952a19e263c267f94fbe0208fdd212b304fa8d3df1379017d184fbcce7ffd5175997774c9de7ef2f3733c7056a22888c9f302e4a9bac35f581d4f571a7ef29e6cf3b1d8a7cc05cd155a047ae498a18fccb6589338242d91e00493a86b2b78810de20644f0f065399894854bd7347927a0ce8f9c1102c9c7227ffba4b71c4325f301933397aa8f54a28d3844c71021d19b72795141af019c9a0abae3e2cc29033b7f8be8465ac8406d4c1d61d0bc3c87dee2faac4d649fc166917c81a1e237c91d5c8091f696a72241c67047cfcec893bb41e97753b3d362695bc31f776cd4a744bf09f2e428dc189fa4838f34d130d5fd4fc3d79bc7546d30d543ca99818a8c39f6c17e74ff45976c95fd6de261d68e2c5fc585d28fa9ae5abb1db475f24d16d9cb0562a589c6dec07f3b81a37b4c7f2c4642df1fabf5d7343e038706e786d2cea71f76663f57a88751287db3f8e9a7a896990374daf72eb776ee67c9ec61c1a10f164688ecbc88caa086e24daa79808899e3c3f6870ed326f5253fc038147774fa8795351f44cbadc53b67743822b89f27f0c03b2b0f4e4c774598db681cadde0e4e28f1f4edbbc8ec68649fe05e3c8cdbc46b07011c9b81b9cb3ad92ec08ddf8209a501ce064ee0bd9befce196c0c559cffcb3b0c447922ad50fbceb288037ec36abb17d93deebd40e83d8c197248b14ee12dcfe72e46f0826ef1e6e94700ad6428df77b54eb8ca767af1fd84507adc52beef32f48e3968c24d990d04cd8b35c87e270a04e2e8fc9d0ab6a6398c2168986321cc0dc297f8e0e4887226db20958e934bc35151de72d896511e3b850d548402a0e1f32fb01d5050a8ff9d7ba6818600a2dafa1c4b3ca11c0d091796190c05a1edc8146d7ef534d67bb39f76f37279dff6be5e053b7315c3f3406e9240c6b618b18545fccb46d668c007a1b640634c663bbd27c5d00a48f5c3702bac6202b55cce4212920be059ecf708db85f07c0fcc0f480fcd06aef1128fc491b2b384d89ce15120c81bd65c225d679f8cd38fb1b0ddb7d8edd3455506fa3406578f43ba4caab00593b6623b7b69c863409f0350b8b8783b9ee2ada9b9f410ab309527b7f67758f543261f52695da19e597f9457483d188e8a2bd7248a6ee5f2d01cccacd2561239959f0ce80cbb83503891a8b4e3ab88d3a02de5f8c784c0700e8bef68445615f25dd3d5baea34bc8e694a7282b054f99fa2b150af00ec62c2fd2227a23e0c0a36090b5986271f964e969cc9313ef42c3b7a9ff9e608342c73da023019e983ee6b6f630e12a02ae79802bfbee10ba20199895d7f1302d2c3b8d7ba6ad08cbb27265f9bb709bf6225a81bdabf7fc5fe9ee4794b00181038051cae0a52c08d8a7750ee46c99b7dd6cd452c52a347f12873dc697786b89ddd13e2d584aa3244cdbdb7809bc7a42728d756485070ff84aaba81b1506a7b20d2acfef11df724ee78e8b0f92376676d1e01aed7ad8d84919b8296684dafc152680b0f964db5a1b7ee4093f453fe24750c6857252e4befef3df2d648e32cc20c1ef48fd5865c242951cd359f92985680f0d626602f164b6285971a194a4baf4eb1d9a3e88841269b3e84a96e6784407f869bca5db2bb2d31e784c35e210dcaf5d3441edea9a4a348e3ead6c9b920e1ff8f1c76c41d564827cd3db006e741a8dbb5db9bdbe13033faac7e6b676bc1cf88677d10676ddca3e187caeeac52b69212503f7acca29a49c699d68f0d982c4c41806c8d9bbbc4e7d2d77a1a0655c73cfcd21b93d95e70d2bad6c306dc172b67120335bd2d03878b3d9e5967c54dd567d307c15e305b5200002710000000002cb41780000000000bebc200b5c42b5c67eb6043b2776c0e9a8bd91d8ffdf7280b81dce825558ad5258746fb030d9b4186ad4f32aae9ca90701dc66e8df3f7b73e1f9590c0f6cd690aae8ad097000000000000000000000000000000000000000000000000000000010000ff0250b3cac5267f9448efcb8c2a89944f8bb4e4e7f1a3ae72d4961dfe187105b3f324b125c87884677613fe191e097b3806667482e0ff7668c64bca637300fe023072000000002b40420f000000000022002090750411c84891017ca3ab8e6212a198dbf957143d6753f7b48264c7faf45cf44752210257f2ca56049071462716385481d04d3c7c859d7e9b3f31c019b126aa0eeed1e82102a87d8f1844a3809284885b41cfc9713a561780b2b784a7a027851f68aaa8387352ae000100400000ffffffffffff0020b0e394cbe4d79e47a73926b89d17d8835e8f042d7adb244a84b6c30496c6355f80007fffffffffff80b125c87884677613fe191e097b3806667482e0ff7668c64bca637300fe023072061a8000002a00000000888bc37730827b0ccb54f13689babb8d211a6cbbec55113caad14a97f6bfce7d85313c9cefa398d15213abf841e3c9a8b88f62fa3fc742a6c746619d3e76aa71fb06226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f061a8000002a000060e32b8d010000900000000000000000000854d00000000a000000003b9aca000000" + val staticRemoteKeyChannel = hex"00020000000303af0ed6052cf28d670665549bc86f4b721c9fdb309d40c58f5811f63966e005d000090ef5e61dc12e5215dfcf8a1263f66b998a162fd80ea9aabf4fd1483d63fcd68280000001000000000000044c0000000008f0d1800000000000002710000000000000000000900064ff160014170e6de64a6d55c73f3ff657ef441d43739837ab028feba10d0eafd0fad8fe20e6d9206e6bd30242826de05c63f459a00aced24b120000186b0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026982039dc0e0b1d25905e44fdf6f8e89755a5e219685840d0bc1d28d3308f9628a358500000000000003e8ffffffffffffffff0000000000004e2000000000000003e80090001e023da0b6ec447fbda75506f743247a7fb6f8e29c1e18cfff53f2f9136801c617a7022dc9905a27397dedf60ef915579f2464c8fa930fae14adb6563e5559905067e5028feba10d0eafd0fad8fe20e6d9206e6bd30242826de05c63f459a00aced24b12032ed22e583b835accc8b4b5bfc94331ce06b07c31952551fd9520e126b1ed43c703da7493b310a19286c452e3d1f8ee66afaf6f1656736f6464d00deedd0b58585b00000003026982000000000000000000000000002710000000002faf0800000000000bebc20024f452ff0b3c6f363530f2a203e8fd6fcd88d177a2dac14b4b045abead090e4f4f000000002b40420f000000000022002065adbae4db91fa9069e2c8dce1f716c65e6dbc302229772d62305bd2e0e6494e475221023da0b6ec447fbda75506f743247a7fb6f8e29c1e18cfff53f2f9136801c617a72103a62130179b4cb0451ddbcd4480c326d5343a691bc01e07bb6eee35fc91a7601752aefd015b02000000000101f452ff0b3c6f363530f2a203e8fd6fcd88d177a2dac14b4b045abead090e4f4f000000000036a2ab8002400d030000000000160014761879f7b274ce995f87150a02e75cc0c037e8e3b8180c00000000002200204b354f6e432cae820a572c8294423f4bc6a5b9a2509d3de22b93c6316b59e14b0400483045022100fe9a0106b51293216f200a5a0b17a783f7ace4edbd71b644dee3e25c2688834802203a1087649b2cba80f5a634c1c67fbce4355f6c5605dd873f12d0399a542e363d01483045022100e71334e385755ab65b7ac6be2709a0be39f98fde6a6c10a895fd6f90ecd3fd7d022036550ecd40ed942f0a4ae3d0e29b6142a3cc4492eb73c3a62ced6d934e48584d01475221023da0b6ec447fbda75506f743247a7fb6f8e29c1e18cfff53f2f9136801c617a72103a62130179b4cb0451ddbcd4480c326d5343a691bc01e07bb6eee35fc91a7601752aeac67892000000000000000000000000000002710000000000bebc200000000002faf080018fa9f3051c52bba85fc20763e8835aed58c763f52a1647c90cc850aeb62ac3d02eada0cd5618069ed848f3975a631f02c87beb9968df8bd99511fa08f75d64529000000000000000000000000000000000000000000000000000000000000ff03b960d87d264cc2c99f71ed6ba6dd1bdb06c03666f76d90a1670a73dc468428e924f452ff0b3c6f363530f2a203e8fd6fcd88d177a2dac14b4b045abead090e4f4f000000002b40420f000000000022002065adbae4db91fa9069e2c8dce1f716c65e6dbc302229772d62305bd2e0e6494e475221023da0b6ec447fbda75506f743247a7fb6f8e29c1e18cfff53f2f9136801c617a72103a62130179b4cb0451ddbcd4480c326d5343a691bc01e07bb6eee35fc91a7601752ae000000f452ff0b3c6f363530f2a203e8fd6fcd88d177a2dac14b4b045abead090e4f4f061a8000002a00000000884a5e841be07f8612321ece5e40b39d715ffe94978c06cf3bb3af1a0cadcefc4b4aaade3deb191662f00b304edeae18ae8c80ed3dc505e8c78876b6fb61682fcb06226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f061a8000002a0000629dbe540101009000000000000003e8000854d00000000a000000003b9aca000000" val commitments = channelDataCodec.decode(staticRemoteKeyChannel.bits).require.value.commitments assert(commitments.channelConfig == ChannelConfig.standard) assert(commitments.channelFeatures == ChannelFeatures(Features.StaticRemoteKey)) @@ -63,7 +63,7 @@ class ChannelCodecs2Spec extends AnyFunSuite { test("ensure remote shutdown script is not set") { val commitments = channelDataCodec.decode(dataNormal.bits).require.value.commitments - assert(commitments.remoteParams.shutdownScript == None) + assert(commitments.remoteParams.shutdownScript.isEmpty) } } 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 index 7636977a31..ce0776fc99 100644 --- 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 @@ -111,7 +111,7 @@ class ChannelCodecs3Spec extends AnyFunSuite { randomKey().publicKey, DeterministicWallet.KeyPath(Seq(42L)), Satoshi(660), - UInt64(500000), + MilliSatoshi(500000), Some(Satoshi(15000)), MilliSatoshi(1000), CltvExpiryDelta(36), @@ -157,7 +157,7 @@ class ChannelCodecs3Spec extends AnyFunSuite { test("backward compatibility DATA_NORMAL_COMPAT_02_Codec") { val oldBin = hex"00022aed498450b3eb2f6aafedd40640b54efc60ae681da9e6a35299b8b6a6125a7301010003af0ed6052cf28d670665549bc86f4b721c9fdb309d40c58f5811f63966e005d00009d2b17f27b3938b2b50ec713df1b1ae5fd3d23010c9e2e22385f13a168c6acf2c80000001000000000000044c000000001dcd65000000000000002710000000000000000000900064ff1600149d706d0fa71a0b6aa0f3fa400bee18102b45c8170000186b0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024982039dc0e0b1d25905e44fdf6f8e89755a5e219685840d0bc1d28d3308f9628a358500000000000003e8ffffffffffffffff0000000000004e2000000000000003e80090001e03fb08866066d5f6f539314220fc31a8e7fdf6ccd12ccde150acc59bac5bb971e003f399d17a9e2fb13a52373d1631807c3161250b2774642fffa629858ad0831f68020b4ecc52820a93f6da40a60d7859307edc737347054d82592959ed1cd0b02e9c03db348203bfd939779bfdd825bc807e904225c3348fa5e3bb57d38ac4b9f40f850284c0df55fbfc2212cbd18cf8ab0eb5283b4b883350ff07e81988e01ae2bb71e20000000302498200000000000000000000000000002710000000002faf0800000000000bebc200242aed498450b3eb2f6aafedd40640b54efc60ae681da9e6a35299b8b6a6125a73000000002b40420f00000000002200203305e10ec90f004675285e9b0371a663ead7abe6caba8c6d5739ace6c9eab4534752210390d6a42ff78a21b41560f75359f0f8a9edaaf0ddcf1a6609130f0d5f234463662103fb08866066d5f6f539314220fc31a8e7fdf6ccd12ccde150acc59bac5bb971e052ae7d02000000012aed498450b3eb2f6aafedd40640b54efc60ae681da9e6a35299b8b6a6125a7300000000000a1e418002400d0300000000001600146862a069e7038573a81f5627ae7d0c6ee5cd0acfb8180c0000000000220020a5f137a8049afcac9f0451b0f31677a81b5443f1c04c1910b37b0d2b8aa4ca0084a4eb2096e400507ac49b57910c914cff8338b8bc57884983541ee1b6919ece7431f4030b09a5fcd87b35682dea0d8faa394e47cc31af897cdf3e6ff502b086cfac37c700000000000000000000000000002710000000000bebc200000000002faf080028131acadf245e7d95d3d7a7f1ac0c0411ead7957ab00d310696b0b5d7d14ac8020597a38e090850030f255fb2781a53713faf7ba81c44de931a63a78efd9908ef000000000000000000000000000000000000000000000000000000000000ff035878c87f6ed100476648193e10a1462bfb55cea3ec5a8f4fbd0fe7304979094b242aed498450b3eb2f6aafedd40640b54efc60ae681da9e6a35299b8b6a6125a73000000002b40420f00000000002200203305e10ec90f004675285e9b0371a663ead7abe6caba8c6d5739ace6c9eab4534752210390d6a42ff78a21b41560f75359f0f8a9edaaf0ddcf1a6609130f0d5f234463662103fb08866066d5f6f539314220fc31a8e7fdf6ccd12ccde150acc59bac5bb971e052ae000000061a8000002a0000000088ec7ae2af533c270809b48f9a0b5a9650df9961a2177e04d7e9929ab319fcd0d150e3ded703b8b4a3f5faff0f2fedf22a6729760deefdea4feed868e4e3cdcf1b06226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f061a8000002a000061163fb60101009000000000000003e8000858b800000014000000003b9aca000000" val decoded1 = channelDataCodec.decode(oldBin.bits).require.value - assert(decoded1.asInstanceOf[DATA_NORMAL].closingFeerates == None) + assert(decoded1.asInstanceOf[DATA_NORMAL].closingFeerates.isEmpty) val newBin = channelDataCodec.encode(decoded1).require.bytes // make sure that encoding used the new codec assert(newBin.startsWith(hex"0009")) @@ -168,7 +168,7 @@ class ChannelCodecs3Spec extends AnyFunSuite { test("backward compatibility DATA_SHUTDOWN_COMPAT_03_Codec") { val oldBin = hex"0003342b8fd35a1f3384c6db37723ecc766b672f61b4b0f2e7d5d81cf1e451b584d301010003af0ed6052cf28d670665549bc86f4b721c9fdb309d40c58f5811f63966e005d00009f2408e50889ac3f6c19a007e25752bf143ab0d920cedb9f1c7b7b6b2270c1fe080000001000000000000044c000000001dcd65000000000000002710000000000000000000900064ff160014d0cd80743458194e5f86d9a74592765442fd15bb0000186b0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024982039dc0e0b1d25905e44fdf6f8e89755a5e219685840d0bc1d28d3308f9628a358500000000000003e8ffffffffffffffff0000000000004e2000000000000003e80090001e03d1a9a2a574585f60abaaa33826488f9eb8d53ca76693bfa69b42ee2bc8ebe9c50223dc803cceb3edff5deacc9965002cc366b719331e776abf76ee680e4afbf46a0315880bf27110fa57f5b75607bc32a098c209fe8a5a2a30120b2a246fd3fcd62e025dc435be4cb790e5ab12705fb3c0b717ddd9f4d0234fdb557358ecefc6a4e97a0238e3723a9d60dac60c2673ec836e2a909ba9fc888fcbd1cd2ad57ff0b10c5c360000000302498200000000000000000001000200fd05aa342b8fd35a1f3384c6db37723ecc766b672f61b4b0f2e7d5d81cf1e451b584d300000000000000000000000011e1a300d91ec390338376481ff3aea604bf2106cf380d78e946e6a4fc0ad72dc0dec51b00061b100002909a15094ba406ca280bce032eab4d25eae4a9e8b51ff65574b6de2033a292cb1bc6ef576207f4b585273048502efad58af480f08dabcbff1a9642eb3b08811eb4417ac14bf6e5e3883d55ba3b7fdaf27e5ebac16ce63d183b2521867f6cedcf55692f1490da9bc655e38281a26150c44d56e02013faf1cdb2457bec4830e67c10ff0d731798d9e383cc3ce9ba21bddd8971e1d206c54c22317d75411b73abb08c9af348cca2aa2f17232b008aaef4bedb98c426041d3698924d089b59c639396ba38d2ba6d59ea2b0ee8ec9f548deced719e9aae73854d8b6c10c78890999ae09b912a8ae98d3513119bfa0ffdd3037cf5690122020f2c0d01b282ad0cbe345bd31cf7e55d8e78c61abfa62f97d2a095e2256c6569d3e6b5652b365d935d16451f2cf7df04e99e675d9eb649b583fc5d810dae3860001e667b9b78733b3ed6ca5058e6806ca4eb493c5c9a53b0ad78b9ea2091d6e94130afb1d79ce8e274a93d748af9d4ee7ae5b1c06cf1f65507bc79db22c30ae6df93a16c279e4beaf50a0e4e87449e9c830fe9b3877b7332b0632743d4e6267ffa404a35d74d79c5d724bdc9aaaa0423a157fb269b916b0022fd52bb0b2702e6abcc7d9d39d7f69a09a9814b3110cc72574fed031bbc0fd5a03fcee1181076369e76c183b2833385a38dd10773fe3228cb18aa731674a574d310a76052cf89c80077aa89380fcfdeda00508f79261c1e1886240de3bbc343eb84ea7879de24f7dbd0b1527201131bcaf5621e49c69ceec36280f9db6d27161c1676c9b11597d4bd8f10032a964fc1d1afcea594237f3408b184b16eba952778252bc6debc30e6e595c7ebbc2af0c00456ca771d024a56d9f074ca5a7f78f1ef107aa42c2a6426f8dbb2ea8962e2128cfc15161512d2e923e2879635c8ba80bc17f92d09abfae4e08a7f34decc1acd4aa4cc08181017bf248321558a8c4d1a45b92b96274dd9f336eb45d8af6d13147be3a250c17106ec6729e0cffc1af5255352296477dea870426aa82e7af3cc07156b65f8d98b482985618b69b99ee3871240db751923dbeddea6e36f5c3f0599300973fe064ccf4f15cadb7372aaab5b300674f5bf28ce905ab411f5605fba7075ed4a6b08dca3ed5867dc32e491c64e7f09ff4095081e0731cbfc53fa42c33e79bd1a26d8e9f8c5b546b07bd1b300f1f357919e955bded1f987401f4da1a453282b6978ff3bfd13b280f6253dd968cb4e7741a15faf7b4c70dbd9eab6461ca3d3a576410213bc4e144a63685488afeeb7857af4ef83e73c88b17798616a9ccbd603d61ec8f4dbbdd5fea5ca748cf40c38fec50d4eebf1e5b57fd32500baa892da24349598c3125162b2ea0ea049ea9aacdfa848f41fdf7f9eb983776bac58ddf762d131196ab18774349a5eca2fc5b51b60d7aceae1321c1decd462f9c7dbbd820399f71a3c3ccbb30a29f76cd8e94243e400c4dc6e6d32b6f94155a21eb89b6b4c0fd1660bd98509d11b3a45fb257ae1e3c5ebae7bae038200c0f7f2d4ee744c3f2d9007d6fb282b0254ccd71eae5b4c4996b52edb2f2f4120356096c81e42168ee43d98bd630b0af01c270db3fb680cd931d388e1c1260126707548ed1f27006a64db7885ac7500ce020f6349a1abf59fb3ca4bc5bdcbd19b7a0cfe82aeea62f0373d5c16002cd9adcb3ef5e0c862e2fda972530b399b0f6365f4edbc36a32bd1766763104aca34450f278418211d62ff3fff2d0de7f516028011e5681ee892288835a3ec6d0d353f8bc7168086a0eed30d5e81d8a51f7debbb2290dc1a1745e0fc2c08778d11ccb78dc7c98a8b4a4b28fd8decda3a2063ad73c23c112d609b6903613c5ad8e178c90fed2ebd10b176b17c9c2dfc630ef744ac289b437ad229b77a393c6b05c10f36ba2f80482ed6e26b3d9c34d2200fd05aa342b8fd35a1f3384c6db37723ecc766b672f61b4b0f2e7d5d81cf1e451b584d30000000000000001000000000bebc20092ebfcedc573c52ba840ff42bb322419ed390dc845c2fe80636b6b82cf41210000061b100002f211b0d97e6c7f7fb800dbb8d1c7536ad7ef284c40a85fc7316b771bb525c91f7e1d4bba90df0cf0d12c19906e4ae0a1b83954632b59f5f499dedaeba19d75c3bc244ccb57089abeaf29c7d73d67ae822aea2ed4d85d27dc65042589e8172aa3b66d928d7e35f027d96bf23e656701bdf13651e25bed745fef014fdec3faaba4795638299975d3cdc8d2c5b19e2e411e6e4f7b3cede7e269c8902306d25b1027e99736489fde667f4eaf5726349851986ff15a9e967385e080079a14c0a9c3001bbce5da720dcf739e67801cfe2a565b24f5515f8d8889a6d2dc0b51fae4facb72904ba8c1949550332cd8b9095655da72a9815537a80efd204d497af47fd18ef0f6d0639424eb81dab0e34f228aed9406d23773874b4c41d9a21dcaf632419e459baaca5f338f0f9718c89fb72108788d32aeb07e2eb343c45891958779e75fe0039eddaf7e5c4aa8ac2aee9928c68dc529d415780d8e14adcecc91b142b238e7657ef1dc6b6e9843bb5fbe8d04564307e515d88b34105b90b3fa9ed91025297a373507cba86160ba5b7b569948c95fd483b28b8970bebd5e17fcad76c6ed64615cc2d7297994483d94c010a210ad3602b7f359d7d1391b97968f9eaa70de83ea1168fdb05190a6e9fc7c984213da3e2a6672d09704d8e29e2aa9349c9ae44eca3dc0522c769887cbaa0926c5bad64eaf7c22399f7abcc01505d921cce15f4613406956715fe3030ab5c74506d1acc30649b596931316a8e210a368d758d7c1f406f5888499f8317a9ba629dfe85453b4413107796bde15636e6f628078863c0009db7d97cfadc2bfdcdfed237debac33dc525f25865663bc7a812099102fe9c65c8a37b179337141c8d76f365824b0db54b0b18d6c88b21406a1e35061fb4f5ef8a280f9c2ac2ada9eea8cb365d346c5e9eaa56728584aa71c4296a1c11d76f03351a91a030ae6df1da008a5d0f92207b8ca22f335b5a347707ef2500119597d5b92c559f477d8405f1d0dfd790c99ca5a7b4aeac232224ea8461ed07636931e65fee7b063d0ef49f471c04e2fd45b2fff3fb6923314e26045259640335c417ed14a0799553dda3eff5065ec5606303c42309221881c7dea17227da4003a6e396e308ca77da3b4b743a1c2771252c2fa8caad98c9985f9157dbcdd355d3a70b2edeca9682e4bba3e7da24fdd472017b89103e61ab9a4bcc9ab75bd28f7fad29327bf710b3b4759bb76983b003a0907794ad73194d14a70769ce6731b0ae21d565b53780275b6ac42c650d47f570331c7ac57fc75390d3b232eece8277a7c8453b5f28206ff1026879981f2ac83a0d4760554401e671a110de6c03cc104927c55de7254311680af4fb5d36b2199e1348f6fa50877d6cb163dd5f70381f2418f20d145d8ed5df2714cdcda59a4362b0c544ee1af01ac41bc15729951b1e53f3a135fe9011d3e938b08c50d53da259e2ab19b97a47b96d6b7fd559704ac9d1d8a223cbb88c9f77fa563c0c66524c260f0ff54471acae87e71c0507b14edf02bd42993966eea6b2f5d36db12b7fec7a63b80a13651822867db1f046081ad2cf3676b88fa2ef700b8c865a7dedcdee739795853584b74c3f59868daf79e81bf70afed8ea1ce689d67090a32dfe351fd0bdaf60b3903d7ff7c149134a95b2ddf1d63e0f89dfe0b710accf2ca3c37647973532338c59d32e562d7c55573277c1fab09d57a452f4214131178683533fbfe7726276903aacd579d36c6679187b1d22dda32fc5302b91244840a54c258e4d416deb0d20f96b214c335608db6b725175d8517f35f9d6b466c751a1253b20051863a02f2e0c073830cb7de27c96c4ccb196e079edc817ebdf70972b917b6a07c6a431567b99c6072b102e5103a22908683f60bb4fb72538ae3a3768de85f9fc682e67c6aea0e000027100000000011e1a300000000000bebc20024342b8fd35a1f3384c6db37723ecc766b672f61b4b0f2e7d5d81cf1e451b584d3000000002b40420f000000000022002091a342be9a9171a40f83766fbf34a0be03b79675dd20c14e13d91651f7f8273e47522103a1bd05e59ffa63f010cee2ff6848730c6f718da57aef6a5df381683d409a815e2103d1a9a2a574585f60abaaa33826488f9eb8d53ca76693bfa69b42ee2bc8ebe9c552aed30200000001342b8fd35a1f3384c6db37723ecc766b672f61b4b0f2e7d5d81cf1e451b584d300000000007d30f88004400d030000000000160014dab249c7d3b8d826d45244f609bb90f72e691daa400d030000000000220020d24765dcd888e08581c2add26ddfaa6f3ef06b56578373c59915bcc25aa0c6ee286a04000000000022002054d7877901aedaf54d84b20a4233107c2fdab9ff637106d44097e69a813d394ee093040000000000220020039e4d3b414381fb8fda640b122e604b20aa6f64e87607dd9354cdc636cb483d1b17b4207914784cfd82df8f93f15defff862cede27811ce4c59df98e86fd57e5b5105921e842a02a47ee6ddb313b37bc0b6706fe3011e2dd2d82066c85ab11a8d7b4e47000202241ad33e0af0717b31e19b50fd6b0469a42807eec1a080ad29cd56d04a4de54313010000002b400d030000000000220020d24765dcd888e08581c2add26ddfaa6f3ef06b56578373c59915bcc25aa0c6ee8576a91474e49ec772064db47a555b032479b20992beeefe8763ac672102cd66c9b36fdd627754f492f15bc2387f44fd70bc4c9ccdb08df37e25250a5b197c820120876475527c2103d80a13db0dffe34a9b1ff383306a52aed0a40a99ce1c34b113ca7467327f608452ae67a9142a784c1850f79298eab62c5c7709a5d468f5522788ac68685e02000000011ad33e0af0717b31e19b50fd6b0469a42807eec1a080ad29cd56d04a4de54313010000000000000000015af302000000000022002054d7877901aedaf54d84b20a4233107c2fdab9ff637106d44097e69a813d394e101b06000000000000000001f8c46e9fa497a4f9f4fdf422840d264f67178defb43320b83c1d9825a6c152995775652ba3689025f4841f165acbd16732ad88629429b3811d71c7b03adf254402241ad33e0af0717b31e19b50fd6b0469a42807eec1a080ad29cd56d04a4de54313030000002be093040000000000220020039e4d3b414381fb8fda640b122e604b20aa6f64e87607dd9354cdc636cb483d8576a91474e49ec772064db47a555b032479b20992beeefe8763ac672102cd66c9b36fdd627754f492f15bc2387f44fd70bc4c9ccdb08df37e25250a5b197c820120876475527c2103d80a13db0dffe34a9b1ff383306a52aed0a40a99ce1c34b113ca7467327f608452ae67a91448d436723875e511f3a4fc540ca63c91637e926388ac68685e02000000011ad33e0af0717b31e19b50fd6b0469a42807eec1a080ad29cd56d04a4de5431303000000000000000001fa7904000000000022002054d7877901aedaf54d84b20a4233107c2fdab9ff637106d44097e69a813d394e101b06000000000000000000ce718c1999b28ddd1207bcdd6789541ec2f405f775efb096bd896bb237b7f5c17543684f99cb53efeade77bc386997e7b5361418c510ed442700cee38c36f18900000000000000010002fffd05aa342b8fd35a1f3384c6db37723ecc766b672f61b4b0f2e7d5d81cf1e451b584d300000000000000000000000011e1a300d91ec390338376481ff3aea604bf2106cf380d78e946e6a4fc0ad72dc0dec51b00061b100002909a15094ba406ca280bce032eab4d25eae4a9e8b51ff65574b6de2033a292cb1bc6ef576207f4b585273048502efad58af480f08dabcbff1a9642eb3b08811eb4417ac14bf6e5e3883d55ba3b7fdaf27e5ebac16ce63d183b2521867f6cedcf55692f1490da9bc655e38281a26150c44d56e02013faf1cdb2457bec4830e67c10ff0d731798d9e383cc3ce9ba21bddd8971e1d206c54c22317d75411b73abb08c9af348cca2aa2f17232b008aaef4bedb98c426041d3698924d089b59c639396ba38d2ba6d59ea2b0ee8ec9f548deced719e9aae73854d8b6c10c78890999ae09b912a8ae98d3513119bfa0ffdd3037cf5690122020f2c0d01b282ad0cbe345bd31cf7e55d8e78c61abfa62f97d2a095e2256c6569d3e6b5652b365d935d16451f2cf7df04e99e675d9eb649b583fc5d810dae3860001e667b9b78733b3ed6ca5058e6806ca4eb493c5c9a53b0ad78b9ea2091d6e94130afb1d79ce8e274a93d748af9d4ee7ae5b1c06cf1f65507bc79db22c30ae6df93a16c279e4beaf50a0e4e87449e9c830fe9b3877b7332b0632743d4e6267ffa404a35d74d79c5d724bdc9aaaa0423a157fb269b916b0022fd52bb0b2702e6abcc7d9d39d7f69a09a9814b3110cc72574fed031bbc0fd5a03fcee1181076369e76c183b2833385a38dd10773fe3228cb18aa731674a574d310a76052cf89c80077aa89380fcfdeda00508f79261c1e1886240de3bbc343eb84ea7879de24f7dbd0b1527201131bcaf5621e49c69ceec36280f9db6d27161c1676c9b11597d4bd8f10032a964fc1d1afcea594237f3408b184b16eba952778252bc6debc30e6e595c7ebbc2af0c00456ca771d024a56d9f074ca5a7f78f1ef107aa42c2a6426f8dbb2ea8962e2128cfc15161512d2e923e2879635c8ba80bc17f92d09abfae4e08a7f34decc1acd4aa4cc08181017bf248321558a8c4d1a45b92b96274dd9f336eb45d8af6d13147be3a250c17106ec6729e0cffc1af5255352296477dea870426aa82e7af3cc07156b65f8d98b482985618b69b99ee3871240db751923dbeddea6e36f5c3f0599300973fe064ccf4f15cadb7372aaab5b300674f5bf28ce905ab411f5605fba7075ed4a6b08dca3ed5867dc32e491c64e7f09ff4095081e0731cbfc53fa42c33e79bd1a26d8e9f8c5b546b07bd1b300f1f357919e955bded1f987401f4da1a453282b6978ff3bfd13b280f6253dd968cb4e7741a15faf7b4c70dbd9eab6461ca3d3a576410213bc4e144a63685488afeeb7857af4ef83e73c88b17798616a9ccbd603d61ec8f4dbbdd5fea5ca748cf40c38fec50d4eebf1e5b57fd32500baa892da24349598c3125162b2ea0ea049ea9aacdfa848f41fdf7f9eb983776bac58ddf762d131196ab18774349a5eca2fc5b51b60d7aceae1321c1decd462f9c7dbbd820399f71a3c3ccbb30a29f76cd8e94243e400c4dc6e6d32b6f94155a21eb89b6b4c0fd1660bd98509d11b3a45fb257ae1e3c5ebae7bae038200c0f7f2d4ee744c3f2d9007d6fb282b0254ccd71eae5b4c4996b52edb2f2f4120356096c81e42168ee43d98bd630b0af01c270db3fb680cd931d388e1c1260126707548ed1f27006a64db7885ac7500ce020f6349a1abf59fb3ca4bc5bdcbd19b7a0cfe82aeea62f0373d5c16002cd9adcb3ef5e0c862e2fda972530b399b0f6365f4edbc36a32bd1766763104aca34450f278418211d62ff3fff2d0de7f516028011e5681ee892288835a3ec6d0d353f8bc7168086a0eed30d5e81d8a51f7debbb2290dc1a1745e0fc2c08778d11ccb78dc7c98a8b4a4b28fd8decda3a2063ad73c23c112d609b6903613c5ad8e178c90fed2ebd10b176b17c9c2dfc630ef744ac289b437ad229b77a393c6b05c10f36ba2f80482ed6e26b3d9c34d22fffd05aa342b8fd35a1f3384c6db37723ecc766b672f61b4b0f2e7d5d81cf1e451b584d30000000000000001000000000bebc20092ebfcedc573c52ba840ff42bb322419ed390dc845c2fe80636b6b82cf41210000061b100002f211b0d97e6c7f7fb800dbb8d1c7536ad7ef284c40a85fc7316b771bb525c91f7e1d4bba90df0cf0d12c19906e4ae0a1b83954632b59f5f499dedaeba19d75c3bc244ccb57089abeaf29c7d73d67ae822aea2ed4d85d27dc65042589e8172aa3b66d928d7e35f027d96bf23e656701bdf13651e25bed745fef014fdec3faaba4795638299975d3cdc8d2c5b19e2e411e6e4f7b3cede7e269c8902306d25b1027e99736489fde667f4eaf5726349851986ff15a9e967385e080079a14c0a9c3001bbce5da720dcf739e67801cfe2a565b24f5515f8d8889a6d2dc0b51fae4facb72904ba8c1949550332cd8b9095655da72a9815537a80efd204d497af47fd18ef0f6d0639424eb81dab0e34f228aed9406d23773874b4c41d9a21dcaf632419e459baaca5f338f0f9718c89fb72108788d32aeb07e2eb343c45891958779e75fe0039eddaf7e5c4aa8ac2aee9928c68dc529d415780d8e14adcecc91b142b238e7657ef1dc6b6e9843bb5fbe8d04564307e515d88b34105b90b3fa9ed91025297a373507cba86160ba5b7b569948c95fd483b28b8970bebd5e17fcad76c6ed64615cc2d7297994483d94c010a210ad3602b7f359d7d1391b97968f9eaa70de83ea1168fdb05190a6e9fc7c984213da3e2a6672d09704d8e29e2aa9349c9ae44eca3dc0522c769887cbaa0926c5bad64eaf7c22399f7abcc01505d921cce15f4613406956715fe3030ab5c74506d1acc30649b596931316a8e210a368d758d7c1f406f5888499f8317a9ba629dfe85453b4413107796bde15636e6f628078863c0009db7d97cfadc2bfdcdfed237debac33dc525f25865663bc7a812099102fe9c65c8a37b179337141c8d76f365824b0db54b0b18d6c88b21406a1e35061fb4f5ef8a280f9c2ac2ada9eea8cb365d346c5e9eaa56728584aa71c4296a1c11d76f03351a91a030ae6df1da008a5d0f92207b8ca22f335b5a347707ef2500119597d5b92c559f477d8405f1d0dfd790c99ca5a7b4aeac232224ea8461ed07636931e65fee7b063d0ef49f471c04e2fd45b2fff3fb6923314e26045259640335c417ed14a0799553dda3eff5065ec5606303c42309221881c7dea17227da4003a6e396e308ca77da3b4b743a1c2771252c2fa8caad98c9985f9157dbcdd355d3a70b2edeca9682e4bba3e7da24fdd472017b89103e61ab9a4bcc9ab75bd28f7fad29327bf710b3b4759bb76983b003a0907794ad73194d14a70769ce6731b0ae21d565b53780275b6ac42c650d47f570331c7ac57fc75390d3b232eece8277a7c8453b5f28206ff1026879981f2ac83a0d4760554401e671a110de6c03cc104927c55de7254311680af4fb5d36b2199e1348f6fa50877d6cb163dd5f70381f2418f20d145d8ed5df2714cdcda59a4362b0c544ee1af01ac41bc15729951b1e53f3a135fe9011d3e938b08c50d53da259e2ab19b97a47b96d6b7fd559704ac9d1d8a223cbb88c9f77fa563c0c66524c260f0ff54471acae87e71c0507b14edf02bd42993966eea6b2f5d36db12b7fec7a63b80a13651822867db1f046081ad2cf3676b88fa2ef700b8c865a7dedcdee739795853584b74c3f59868daf79e81bf70afed8ea1ce689d67090a32dfe351fd0bdaf60b3903d7ff7c149134a95b2ddf1d63e0f89dfe0b710accf2ca3c37647973532338c59d32e562d7c55573277c1fab09d57a452f4214131178683533fbfe7726276903aacd579d36c6679187b1d22dda32fc5302b91244840a54c258e4d416deb0d20f96b214c335608db6b725175d8517f35f9d6b466c751a1253b20051863a02f2e0c073830cb7de27c96c4ccb196e079edc817ebdf70972b917b6a07c6a431567b99c6072b102e5103a22908683f60bb4fb72538ae3a3768de85f9fc682e67c6aea0e00002710000000000bebc2000000000011e1a300306acd0b21100f755a6d193a819042fde1b4c3839598e730905dfa7e6ef699220240a9cccdb58d887b42ccadeee5704030acd52bd9c7759ba01f47f0995531ca360000000000000000000000000000000000000002000000000000000000020000000000000000000334c7b350311d40b3b422e07f3b7759b400000000000000010003e3dd409b342046e7b410cc380c9a09c2ff03cdeeaf422678a9eac407da8f811a402718083016f88d5404f5508054fe25acb824342b8fd35a1f3384c6db37723ecc766b672f61b4b0f2e7d5d81cf1e451b584d3000000002b40420f000000000022002091a342be9a9171a40f83766fbf34a0be03b79675dd20c14e13d91651f7f8273e47522103a1bd05e59ffa63f010cee2ff6848730c6f718da57aef6a5df381683d409a815e2103d1a9a2a574585f60abaaa33826488f9eb8d53ca76693bfa69b42ee2bc8ebe9c552ae000100400000ffffffffffff00204cec06f1f1496c01cd4840cddff19b47c24b7daa478bcaea862c6d11fcc9fff180007fffffffffff8038342b8fd35a1f3384c6db37723ecc766b672f61b4b0f2e7d5d81cf1e451b584d300160014d0cd80743458194e5f86d9a74592765442fd15bb38342b8fd35a1f3384c6db37723ecc766b672f61b4b0f2e7d5d81cf1e451b584d30016001483366b494906052362a88e967304296937926cd1" val decoded1 = channelDataCodec.decode(oldBin.bits).require.value - assert(decoded1.asInstanceOf[DATA_SHUTDOWN].closingFeerates == None) + assert(decoded1.asInstanceOf[DATA_SHUTDOWN].closingFeerates.isEmpty) val newBin = channelDataCodec.encode(decoded1).require.bytes // make sure that encoding used the new codec assert(newBin.startsWith(hex"0008")) From 0c47950254092469be4651bd2e3dc426b1db1add Mon Sep 17 00:00:00 2001 From: t-bast Date: Thu, 23 Jun 2022 10:32:48 +0200 Subject: [PATCH 2/3] Set max-htlc-in-flight based on channel capacity We introduce a new parameter to set `max-htlc-value-in-flight` based on the channel capacity, when it provides a lower value than the existing `max-htlc-value-in-flight-msat` static value. --- eclair-core/src/main/resources/reference.conf | 5 ++- .../scala/fr/acinq/eclair/NodeParams.scala | 1 + .../fr/acinq/eclair/channel/fsm/Channel.scala | 3 ++ .../main/scala/fr/acinq/eclair/io/Peer.scala | 2 +- .../scala/fr/acinq/eclair/TestConstants.scala | 2 ++ .../eclair/integration/IntegrationSpec.scala | 1 + .../scala/fr/acinq/eclair/io/PeerSpec.scala | 36 +++++++++++++++++++ 7 files changed, 48 insertions(+), 2 deletions(-) diff --git a/eclair-core/src/main/resources/reference.conf b/eclair-core/src/main/resources/reference.conf index 1ee6a20b28..a0925827be 100644 --- a/eclair-core/src/main/resources/reference.conf +++ b/eclair-core/src/main/resources/reference.conf @@ -84,8 +84,11 @@ eclair { dust-limit-satoshis = 546 max-remote-dust-limit-satoshis = 600 htlc-minimum-msat = 1 - // The following parameters apply to each HTLC direction (incoming or outgoing), which means that the total HTLC limits will be twice what is set here + // The following parameters apply to each HTLC direction (incoming or outgoing), which means that the total HTLC limits will be twice what is set here. + // The smallest value of max-htlc-value-in-flight-msat and max-htlc-value-in-flight-percent will be applied when opening channels. + // If for example you open a 60 mBTC channel, eclair will set max-htlc-value-in-flight to 27 mBTC. max-htlc-value-in-flight-msat = 5000000000 // 50 mBTC + max-htlc-value-in-flight-percent = 45 // 45% of the channel capacity max-accepted-htlcs = 30 reserve-to-funding-ratio = 0.01 // recommended by BOLT #2 diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/NodeParams.scala b/eclair-core/src/main/scala/fr/acinq/eclair/NodeParams.scala index 58308cb826..f83c76a9e8 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/NodeParams.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/NodeParams.scala @@ -417,6 +417,7 @@ object NodeParams extends Logging { maxRemoteDustLimit = Satoshi(config.getLong("channel.max-remote-dust-limit-satoshis")), htlcMinimum = htlcMinimum, maxHtlcValueInFlightMsat = MilliSatoshi(config.getLong("channel.max-htlc-value-in-flight-msat")), + maxHtlcValueInFlightPercent = config.getInt("channel.max-htlc-value-in-flight-percent"), maxAcceptedHtlcs = maxAcceptedHtlcs, reserveToFundingRatio = config.getDouble("channel.reserve-to-funding-ratio"), maxReserveToFundingRatio = config.getDouble("channel.max-reserve-to-funding-ratio"), diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/channel/fsm/Channel.scala b/eclair-core/src/main/scala/fr/acinq/eclair/channel/fsm/Channel.scala index f195f1c384..392b68b9f8 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/channel/fsm/Channel.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/channel/fsm/Channel.scala @@ -65,6 +65,7 @@ object Channel { maxRemoteDustLimit: Satoshi, htlcMinimum: MilliSatoshi, maxHtlcValueInFlightMsat: MilliSatoshi, + maxHtlcValueInFlightPercent: Int, maxAcceptedHtlcs: Int, reserveToFundingRatio: Double, maxReserveToFundingRatio: Double, @@ -81,6 +82,8 @@ object Channel { maxTxPublishRetryDelay: FiniteDuration, unhandledExceptionStrategy: UnhandledExceptionStrategy, revocationTimeout: FiniteDuration) { + require(0 <= maxHtlcValueInFlightPercent && maxHtlcValueInFlightPercent <= 100, "max-htlc-value-in-flight-percent must be between 0 and 100") + def minFundingSatoshis(announceChannel: Boolean): Satoshi = if (announceChannel) minFundingPublicSatoshis else minFundingPrivateSatoshis } diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/io/Peer.scala b/eclair-core/src/main/scala/fr/acinq/eclair/io/Peer.scala index b9bfb51dae..f7c52ce9ef 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/io/Peer.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/io/Peer.scala @@ -532,7 +532,7 @@ object Peer { nodeParams.nodeId, nodeParams.channelKeyManager.newFundingKeyPath(isInitiator), // we make sure that initiator and non-initiator key paths end differently dustLimit = nodeParams.channelConf.dustLimit, - maxHtlcValueInFlightMsat = nodeParams.channelConf.maxHtlcValueInFlightMsat.min(fundingAmount), + maxHtlcValueInFlightMsat = nodeParams.channelConf.maxHtlcValueInFlightMsat.min(fundingAmount * nodeParams.channelConf.maxHtlcValueInFlightPercent / 100), requestedChannelReserve_opt = Some((fundingAmount * nodeParams.channelConf.reserveToFundingRatio).max(nodeParams.channelConf.dustLimit)), // BOLT #2: make sure that our reserve is above our dust limit htlcMinimum = nodeParams.channelConf.htlcMinimum, toSelfDelay = nodeParams.channelConf.toRemoteDelay, // we choose their delay diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/TestConstants.scala b/eclair-core/src/test/scala/fr/acinq/eclair/TestConstants.scala index cb7c05fda7..b7b8584aa0 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/TestConstants.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/TestConstants.scala @@ -103,6 +103,7 @@ object TestConstants { dustLimit = 1100 sat, maxRemoteDustLimit = 1500 sat, maxHtlcValueInFlightMsat = 500_000_000 msat, + maxHtlcValueInFlightPercent = 100, maxAcceptedHtlcs = 100, expiryDelta = CltvExpiryDelta(144), fulfillSafetyBeforeTimeout = CltvExpiryDelta(6), @@ -244,6 +245,7 @@ object TestConstants { dustLimit = 1000 sat, maxRemoteDustLimit = 1500 sat, maxHtlcValueInFlightMsat = Long.MaxValue.msat, // Bob has no limit on the combined max value of in-flight htlcs + maxHtlcValueInFlightPercent = 100, maxAcceptedHtlcs = 30, expiryDelta = CltvExpiryDelta(144), fulfillSafetyBeforeTimeout = CltvExpiryDelta(6), diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/integration/IntegrationSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/integration/IntegrationSpec.scala index 1e383811e0..e74ccda140 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/integration/IntegrationSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/integration/IntegrationSpec.scala @@ -82,6 +82,7 @@ abstract class IntegrationSpec extends TestKitBaseClass with BitcoindService wit "eclair.bitcoind.wallet" -> defaultWallet, "eclair.channel.mindepth-blocks" -> 2, "eclair.channel.max-htlc-value-in-flight-msat" -> 100000000000L, + "eclair.channel.max-htlc-value-in-flight-percent" -> 100, "eclair.channel.max-block-processing-delay" -> "2 seconds", "eclair.channel.to-remote-delay-blocks" -> 24, "eclair.channel.max-funding-satoshis" -> 500000000, diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/io/PeerSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/io/PeerSpec.scala index de1b274936..eb67c8acc9 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/io/PeerSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/io/PeerSpec.scala @@ -75,6 +75,8 @@ class PeerSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with Paralle .modify(_.features).setToIf(test.tags.contains("anchor_outputs"))(Features(StaticRemoteKey -> Optional, AnchorOutputs -> Optional)) .modify(_.features).setToIf(test.tags.contains("anchor_outputs_zero_fee_htlc_tx"))(Features(StaticRemoteKey -> Optional, AnchorOutputs -> Optional, AnchorOutputsZeroFeeHtlcTx -> Optional)) .modify(_.channelConf.maxFundingSatoshis).setToIf(test.tags.contains("high-max-funding-satoshis"))(Btc(0.9)) + .modify(_.channelConf.maxHtlcValueInFlightMsat).setToIf(test.tags.contains("max-htlc-value-in-flight-percent"))(100_000_000 msat) + .modify(_.channelConf.maxHtlcValueInFlightPercent).setToIf(test.tags.contains("max-htlc-value-in-flight-percent"))(25) .modify(_.autoReconnect).setToIf(test.tags.contains("auto_reconnect"))(true) if (test.tags.contains("with_node_announcement")) { @@ -450,6 +452,40 @@ class PeerSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with Paralle assert(init.localParams.defaultFinalScriptPubKey == Script.write(Script.pay2wpkh(init.localParams.walletStaticPaymentBasepoint.get))) } + test("compute max-htlc-value-in-flight based on funding amount", Tag("max-htlc-value-in-flight-percent")) { f => + import f._ + + val probe = TestProbe() + connect(remoteNodeId, peer, peerConnection, switchboard) + assert(peer.underlyingActor.nodeParams.channelConf.maxHtlcValueInFlightPercent == 25) + assert(peer.underlyingActor.nodeParams.channelConf.maxHtlcValueInFlightMsat == 100_000_000.msat) + + { + probe.send(peer, Peer.OpenChannel(remoteNodeId, 200_000 sat, 0 msat, None, None, None, None)) + val init = channel.expectMsgType[INPUT_INIT_FUNDER] + assert(init.localParams.maxHtlcValueInFlightMsat == 50_000_000.msat) // max-htlc-value-in-flight-percent + } + { + probe.send(peer, Peer.OpenChannel(remoteNodeId, 500_000 sat, 0 msat, None, None, None, None)) + val init = channel.expectMsgType[INPUT_INIT_FUNDER] + assert(init.localParams.maxHtlcValueInFlightMsat == 100_000_000.msat) // max-htlc-value-in-flight-msat + } + { + val open = createOpenChannelMessage().copy(fundingSatoshis = 200_000 sat) + peerConnection.send(peer, open) + val init = channel.expectMsgType[INPUT_INIT_FUNDEE] + assert(init.localParams.maxHtlcValueInFlightMsat == 50_000_000.msat) // max-htlc-value-in-flight-percent + channel.expectMsg(open) + } + { + val open = createOpenChannelMessage().copy(fundingSatoshis = 500_000 sat) + peerConnection.send(peer, open) + val init = channel.expectMsgType[INPUT_INIT_FUNDEE] + assert(init.localParams.maxHtlcValueInFlightMsat == 100_000_000.msat) // max-htlc-value-in-flight-msat + channel.expectMsg(open) + } + } + test("do not allow option_scid_alias with public channel") { f => import f._ From 7ed9ddd871d2001c23fcfc3393cdfa8b4000173e Mon Sep 17 00:00:00 2001 From: t-bast Date: Fri, 24 Jun 2022 18:08:05 +0200 Subject: [PATCH 3/3] Add a channel congestion control mechanism Channels have a limited number of HTLCs that can be in-flight at a given time, because the commitment transaction cannot have an unbounded number of outputs. Malicious actors can exploit this by filling our channels with HTLCs and waiting as long as possible before failing them (also known as a channel jamming attack). To increase the cost of this attack, we don't let our channels be filled with low-value HTLCs. When we already have many low-value HTLCs in-flight, we only accept higher value HTLCs. Attackers will have to lock non-negligible amounts to carry out the attack. --- .../channel/ChannelCongestionControl.scala | 132 +++++++++++ .../eclair/channel/ChannelExceptions.scala | 1 + .../fr/acinq/eclair/channel/Commitments.scala | 73 +++--- .../acinq/eclair/channel/DustExposure.scala | 75 +------ .../acinq/eclair/channel/HtlcFiltering.scala | 99 +++++++++ .../eclair/payment/relay/ChannelRelay.scala | 1 + .../ChannelCongestionControlSpec.scala | 207 ++++++++++++++++++ .../eclair/channel/DustExposureSpec.scala | 11 +- .../ChannelStateTestsHelperMethods.scala | 17 ++ .../channel/states/e/NormalStateSpec.scala | 69 +++++- .../payment/relay/ChannelRelayerSpec.scala | 2 +- 11 files changed, 576 insertions(+), 111 deletions(-) create mode 100644 eclair-core/src/main/scala/fr/acinq/eclair/channel/ChannelCongestionControl.scala create mode 100644 eclair-core/src/main/scala/fr/acinq/eclair/channel/HtlcFiltering.scala create mode 100644 eclair-core/src/test/scala/fr/acinq/eclair/channel/ChannelCongestionControlSpec.scala diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/channel/ChannelCongestionControl.scala b/eclair-core/src/main/scala/fr/acinq/eclair/channel/ChannelCongestionControl.scala new file mode 100644 index 0000000000..6a8df5ea8c --- /dev/null +++ b/eclair-core/src/main/scala/fr/acinq/eclair/channel/ChannelCongestionControl.scala @@ -0,0 +1,132 @@ +/* + * Copyright 2022 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.channel + +import akka.event.LoggingAdapter +import fr.acinq.bitcoin.scalacompat.Satoshi +import fr.acinq.eclair.MilliSatoshi +import fr.acinq.eclair.channel.HtlcFiltering.FilteredHtlcs +import fr.acinq.eclair.transactions.Transactions._ +import fr.acinq.eclair.transactions.{CommitmentSpec, IncomingHtlc, OutgoingHtlc} +import fr.acinq.eclair.wire.protocol.UpdateAddHtlc + +/** + * Created by t-bast on 22/06/2022. + */ + +/** + * Channels have a limited number of HTLCs that can be in-flight at a given time, because the commitment transaction + * cannot have an unbounded number of outputs. Malicious actors can exploit this by filling our channels with HTLCs and + * waiting as long as possible before failing them. + * + * To increase the cost of this attack, we don't let our channels be filled with low-value HTLCs. When we already have + * many low-value HTLCs in-flight, we only accept higher value HTLCs. Attackers will have to lock non-negligible amounts + * to carry out the attack. + */ +object ChannelCongestionControl { + + case class HtlcBucket(threshold: MilliSatoshi, size: Int) { + def allowHtlc(add: UpdateAddHtlc, current: Seq[UpdateAddHtlc]): Boolean = { + // We allow the HTLC if it belongs to a bigger bucket or if the bucket isn't full. + add.amountMsat > threshold || current.count(_.amountMsat <= threshold) < size + } + } + + case class CongestionConfig(maxAcceptedHtlcs: Int, maxHtlcValueInFlight: MilliSatoshi, buckets: Seq[HtlcBucket]) { + def allowHtlc(add: UpdateAddHtlc, current: Seq[UpdateAddHtlc], trimThreshold: Satoshi)(implicit log: LoggingAdapter): Boolean = { + // We allow the HTLC if it's trimmed (since it doesn't use an output in the commit tx) or if we can find a bucket that isn't full. + val allow = add.amountMsat < trimThreshold || buckets.forall(_.allowHtlc(add, current)) + if (!allow) { + log.info("htlc rejected by congestion control (amount={} max-accepted={} max-in-flight={}): current={}", add.amountMsat, maxAcceptedHtlcs, maxHtlcValueInFlight, current.map(_.amountMsat).sorted.mkString(", ")) + } + allow + } + } + + object CongestionConfig { + /** + * With the following configuration, if we allow 30 HTLCs and a maximum value in-flight of 250 000 sats, an attacker + * would need to lock 165 000 sats in order to fill our channel. + */ + def apply(maxAcceptedHtlcs: Int, maxHtlcValueInFlight: MilliSatoshi): CongestionConfig = { + val buckets = Seq( + HtlcBucket(maxHtlcValueInFlight / 100, maxAcceptedHtlcs / 2), // allow at most 50% of htlcs below 1% of our max-in-flight + HtlcBucket(maxHtlcValueInFlight * 5 / 100, maxAcceptedHtlcs * 8 / 10), // allow at most 80% of htlcs below 5% of our max-in-flight + HtlcBucket(maxHtlcValueInFlight * 10 / 100, maxAcceptedHtlcs * 9 / 10), // allow at most 90% of htlcs below 10% of our max-in-flight + ) + CongestionConfig(maxAcceptedHtlcs, maxHtlcValueInFlight, buckets) + } + } + + def shouldSendHtlc(add: UpdateAddHtlc, + localSpec: CommitmentSpec, + localDustLimit: Satoshi, + localMaxAcceptedHtlcs: Int, + remoteSpec: CommitmentSpec, + remoteDustLimit: Satoshi, + remoteMaxAcceptedHtlcs: Int, + maxHtlcValueInFlight: MilliSatoshi, + commitmentFormat: CommitmentFormat)(implicit log: LoggingAdapter): Boolean = { + // We apply the most restrictive value between our peer's and ours. + val maxAcceptedHtlcs = localMaxAcceptedHtlcs.min(remoteMaxAcceptedHtlcs) + val config = CongestionConfig(maxAcceptedHtlcs, maxHtlcValueInFlight) + val localOk = { + val pending = trimOfferedHtlcs(localDustLimit, localSpec, commitmentFormat).map(_.add) + val trimThreshold = offeredHtlcTrimThreshold(localDustLimit, localSpec, commitmentFormat) + config.allowHtlc(add, pending, trimThreshold) + } + val remoteOk = { + val pending = trimReceivedHtlcs(remoteDustLimit, remoteSpec, commitmentFormat).map(_.add) + val trimThreshold = receivedHtlcTrimThreshold(remoteDustLimit, remoteSpec, commitmentFormat) + config.allowHtlc(add, pending, trimThreshold) + } + localOk && remoteOk + } + + def filterBeforeForward(localSpec: CommitmentSpec, + localDustLimit: Satoshi, + localMaxAcceptedHtlcs: Int, + remoteSpec: CommitmentSpec, + remoteDustLimit: Satoshi, + receivedHtlcs: FilteredHtlcs, + maxHtlcValueInFlight: MilliSatoshi, + commitmentFormat: CommitmentFormat)(implicit log: LoggingAdapter): FilteredHtlcs = { + val config = CongestionConfig(localMaxAcceptedHtlcs, maxHtlcValueInFlight) + val (_, _, result) = receivedHtlcs.accepted.foldLeft((localSpec, remoteSpec, receivedHtlcs.copy(accepted = Seq.empty))) { + case ((currentLocalSpec, currentRemoteSpec, currentHtlcs), add) => + val localOk = { + val pending = trimReceivedHtlcs(localDustLimit, currentLocalSpec, commitmentFormat).map(_.add) + val trimThreshold = receivedHtlcTrimThreshold(localDustLimit, currentLocalSpec, commitmentFormat) + config.allowHtlc(add, pending, trimThreshold) + } + val remoteOk = { + val pending = trimOfferedHtlcs(remoteDustLimit, currentRemoteSpec, commitmentFormat).map(_.add) + val trimThreshold = offeredHtlcTrimThreshold(remoteDustLimit, currentRemoteSpec, commitmentFormat) + config.allowHtlc(add, pending, trimThreshold) + } + if (localOk && remoteOk) { + val nextLocalSpec = CommitmentSpec.addHtlc(currentLocalSpec, IncomingHtlc(add)) + val nextRemoteSpec = CommitmentSpec.addHtlc(currentRemoteSpec, OutgoingHtlc(add)) + (nextLocalSpec, nextRemoteSpec, currentHtlcs.accept(add)) + } else { + (currentLocalSpec, currentRemoteSpec, currentHtlcs.reject(add)) + } + } + result + } + +} diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/channel/ChannelExceptions.scala b/eclair-core/src/main/scala/fr/acinq/eclair/channel/ChannelExceptions.scala index 222726ed80..d1c2ded44c 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/channel/ChannelExceptions.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/channel/ChannelExceptions.scala @@ -79,6 +79,7 @@ case class ExpiryTooBig (override val channelId: Byte case class HtlcValueTooSmall (override val channelId: ByteVector32, minimum: MilliSatoshi, actual: MilliSatoshi) extends ChannelException(channelId, s"htlc value too small: minimum=$minimum actual=$actual") case class HtlcValueTooHighInFlight (override val channelId: ByteVector32, maximum: UInt64, actual: MilliSatoshi) extends ChannelException(channelId, s"in-flight htlcs hold too much value: maximum=$maximum actual=$actual") case class TooManyAcceptedHtlcs (override val channelId: ByteVector32, maximum: Long) extends ChannelException(channelId, s"too many accepted htlcs: maximum=$maximum") +case class HtlcRejectedByCongestionControl (override val channelId: ByteVector32, amount: MilliSatoshi) extends ChannelException(channelId, s"htlc rejected to avoid channel congestion: amount=$amount") case class LocalDustHtlcExposureTooHigh (override val channelId: ByteVector32, maximum: Satoshi, actual: MilliSatoshi) extends ChannelException(channelId, s"dust htlcs hold too much value: maximum=$maximum actual=$actual") case class RemoteDustHtlcExposureTooHigh (override val channelId: ByteVector32, maximum: Satoshi, actual: MilliSatoshi) extends ChannelException(channelId, s"dust htlcs hold too much value: maximum=$maximum actual=$actual") case class InsufficientFunds (override val channelId: ByteVector32, amount: MilliSatoshi, missing: Satoshi, reserve: Satoshi, fees: Satoshi) extends ChannelException(channelId, s"insufficient funds: missing=$missing reserve=$reserve fees=$fees") 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 34ee34c71c..d1f1137b8d 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 @@ -22,6 +22,7 @@ import fr.acinq.bitcoin.scalacompat.{ByteVector32, ByteVector64, Crypto, Satoshi import fr.acinq.eclair._ import fr.acinq.eclair.blockchain.fee.{FeeratePerKw, OnChainFeeConf} import fr.acinq.eclair.channel.Helpers.Closing +import fr.acinq.eclair.channel.HtlcFiltering.FilteredHtlcs import fr.acinq.eclair.channel.Monitoring.Metrics import fr.acinq.eclair.channel.fsm.Channel import fr.acinq.eclair.crypto.keymanager.ChannelKeyManager @@ -339,7 +340,7 @@ object Commitments { * @param cmd add HTLC command * @return either Left(failure, error message) where failure is a failure message (see BOLT #4 and the Failure Message class) or Right(new commitments, updateAddHtlc) */ - def sendAdd(commitments: Commitments, cmd: CMD_ADD_HTLC, currentHeight: BlockHeight, feeConf: OnChainFeeConf): Either[ChannelException, (Commitments, UpdateAddHtlc)] = { + def sendAdd(commitments: Commitments, cmd: CMD_ADD_HTLC, currentHeight: BlockHeight, feeConf: OnChainFeeConf)(implicit log: LoggingAdapter): Either[ChannelException, (Commitments, UpdateAddHtlc)] = { // we must ensure we're not relaying htlcs that are already expired, otherwise the downstream channel will instantly close // NB: we add a 3 blocks safety to reduce the probability of running into this when our bitcoin node is slightly outdated val minExpiry = CltvExpiry(currentHeight + 3) @@ -409,16 +410,27 @@ object Commitments { } // If sending this htlc would overflow our dust exposure, we reject it. - val maxDustExposure = feeConf.feerateToleranceFor(commitments.remoteNodeId).dustTolerance.maxExposure - val localReduced = DustExposure.reduceForDustExposure(commitments.localCommit.spec, commitments1.localChanges.all, commitments.remoteChanges.all) - val localDustExposureAfterAdd = DustExposure.computeExposure(localReduced, commitments.localParams.dustLimit, commitments.commitmentFormat) - if (localDustExposureAfterAdd > maxDustExposure) { - return Left(LocalDustHtlcExposureTooHigh(commitments.channelId, maxDustExposure, localDustExposureAfterAdd)) + { + val maxDustExposure = feeConf.feerateToleranceFor(commitments.remoteNodeId).dustTolerance.maxExposure + val localReduced = HtlcFiltering.reduceForHtlcFiltering(commitments.localCommit.spec, commitments1.localChanges.all, commitments.remoteChanges.all) + val localDustExposureAfterAdd = DustExposure.computeExposure(localReduced, commitments.localParams.dustLimit, commitments.commitmentFormat) + if (localDustExposureAfterAdd > maxDustExposure) { + return Left(LocalDustHtlcExposureTooHigh(commitments.channelId, maxDustExposure, localDustExposureAfterAdd)) + } + val remoteReduced = HtlcFiltering.reduceForHtlcFiltering(remoteCommit1.spec, commitments.remoteChanges.all, commitments1.localChanges.all) + val remoteDustExposureAfterAdd = DustExposure.computeExposure(remoteReduced, commitments.remoteParams.dustLimit, commitments.commitmentFormat) + if (remoteDustExposureAfterAdd > maxDustExposure) { + return Left(RemoteDustHtlcExposureTooHigh(commitments.channelId, maxDustExposure, remoteDustExposureAfterAdd)) + } } - val remoteReduced = DustExposure.reduceForDustExposure(remoteCommit1.spec, commitments.remoteChanges.all, commitments1.localChanges.all) - val remoteDustExposureAfterAdd = DustExposure.computeExposure(remoteReduced, commitments.remoteParams.dustLimit, commitments.commitmentFormat) - if (remoteDustExposureAfterAdd > maxDustExposure) { - return Left(RemoteDustHtlcExposureTooHigh(commitments.channelId, maxDustExposure, remoteDustExposureAfterAdd)) + + // If sending this htlc would exceed our congestion control, we reject it. + { + val localReduced = HtlcFiltering.reduceForHtlcFiltering(commitments.localCommit.spec, commitments.localChanges.all, commitments.remoteChanges.all) + val remoteReduced = HtlcFiltering.reduceForHtlcFiltering(commitments.remoteNextCommitInfo.left.toOption.map(_.nextRemoteCommit).getOrElse(commitments.remoteCommit).spec, commitments.remoteChanges.all, commitments.localChanges.all) + if (!ChannelCongestionControl.shouldSendHtlc(add, localReduced, commitments.localParams.dustLimit, commitments.localParams.maxAcceptedHtlcs, remoteReduced, commitments.remoteParams.dustLimit, commitments.remoteParams.maxAcceptedHtlcs, commitments.localParams.maxHtlcValueInFlightMsat, commitments.commitmentFormat)) { + return Left(HtlcRejectedByCongestionControl(commitments.channelId, add.amountMsat)) + } } Right(commitments1, add) @@ -581,12 +593,12 @@ object Commitments { val maxDustExposure = feeConf.feerateToleranceFor(commitments.remoteNodeId).dustTolerance.maxExposure // this is the commitment as it would be if our update_fee was immediately signed by both parties (it is only an // estimate because there can be concurrent updates) - val localReduced = DustExposure.reduceForDustExposure(commitments.localCommit.spec, commitments1.localChanges.all, commitments.remoteChanges.all) + val localReduced = HtlcFiltering.reduceForHtlcFiltering(commitments.localCommit.spec, commitments1.localChanges.all, commitments.remoteChanges.all) val localDustExposureAfterFeeUpdate = DustExposure.computeExposure(localReduced, cmd.feeratePerKw, commitments.localParams.dustLimit, commitments.commitmentFormat) if (localDustExposureAfterFeeUpdate > maxDustExposure) { return Left(LocalDustHtlcExposureTooHigh(commitments.channelId, maxDustExposure, localDustExposureAfterFeeUpdate)) } - val remoteReduced = DustExposure.reduceForDustExposure(commitments.remoteCommit.spec, commitments.remoteChanges.all, commitments1.localChanges.all) + val remoteReduced = HtlcFiltering.reduceForHtlcFiltering(commitments.remoteCommit.spec, commitments.remoteChanges.all, commitments1.localChanges.all) val remoteDustExposureAfterFeeUpdate = DustExposure.computeExposure(remoteReduced, cmd.feeratePerKw, commitments.remoteParams.dustLimit, commitments.commitmentFormat) if (remoteDustExposureAfterFeeUpdate > maxDustExposure) { return Left(RemoteDustHtlcExposureTooHigh(commitments.channelId, maxDustExposure, remoteDustExposureAfterFeeUpdate)) @@ -629,14 +641,14 @@ object Commitments { // if we would overflow our dust exposure with the new feerate, we reject this fee update if (feeConf.feerateToleranceFor(commitments.remoteNodeId).dustTolerance.closeOnUpdateFeeOverflow) { val maxDustExposure = feeConf.feerateToleranceFor(commitments.remoteNodeId).dustTolerance.maxExposure - val localReduced = DustExposure.reduceForDustExposure(commitments.localCommit.spec, commitments.localChanges.all, commitments1.remoteChanges.all) + val localReduced = HtlcFiltering.reduceForHtlcFiltering(commitments.localCommit.spec, commitments.localChanges.all, commitments1.remoteChanges.all) val localDustExposureAfterFeeUpdate = DustExposure.computeExposure(localReduced, fee.feeratePerKw, commitments.localParams.dustLimit, commitments.commitmentFormat) if (localDustExposureAfterFeeUpdate > maxDustExposure) { return Left(LocalDustHtlcExposureTooHigh(commitments.channelId, maxDustExposure, localDustExposureAfterFeeUpdate)) } // this is the commitment as it would be if their update_fee was immediately signed by both parties (it is only an // estimate because there can be concurrent updates) - val remoteReduced = DustExposure.reduceForDustExposure(commitments.remoteCommit.spec, commitments1.remoteChanges.all, commitments.localChanges.all) + val remoteReduced = HtlcFiltering.reduceForHtlcFiltering(commitments.remoteCommit.spec, commitments1.remoteChanges.all, commitments.localChanges.all) val remoteDustExposureAfterFeeUpdate = DustExposure.computeExposure(remoteReduced, fee.feeratePerKw, commitments.remoteParams.dustLimit, commitments.commitmentFormat) if (remoteDustExposureAfterFeeUpdate > maxDustExposure) { return Left(RemoteDustHtlcExposureTooHigh(commitments.channelId, maxDustExposure, remoteDustExposureAfterFeeUpdate)) @@ -770,7 +782,7 @@ object Commitments { } // @formatter:on - def receiveRevocation(commitments: Commitments, revocation: RevokeAndAck, maxDustExposure: Satoshi): Either[ChannelException, (Commitments, Seq[PostRevocationAction])] = { + def receiveRevocation(commitments: Commitments, revocation: RevokeAndAck, maxDustExposure: Satoshi)(implicit log: LoggingAdapter): Either[ChannelException, (Commitments, Seq[PostRevocationAction])] = { // we receive a revocation because we just sent them a sig for their next commit tx commitments.remoteNextCommitInfo match { case Left(_) if revocation.perCommitmentSecret.publicKey != commitments.remoteCommit.remotePerCommitmentPoint => @@ -793,7 +805,7 @@ object Commitments { val add = commitments.remoteCommit.spec.findIncomingHtlcById(fail.id).map(_.add).get RES_ADD_SETTLED(origin, add, HtlcResult.RemoteFailMalformed(fail)) } - val (acceptedHtlcs, rejectedHtlcs) = { + val filteredHtlcs = { // the received htlcs have already been added to commitments (they've been signed by our peer), and may already // overflow our dust exposure (we cannot prevent them from adding htlcs): we artificially remove them before // deciding which we'll keep and relay and which we'll fail without relaying. @@ -805,25 +817,34 @@ object Commitments { case OutgoingHtlc(add) if receivedHtlcs.contains(add) => false case _ => true }) - val localReduced = DustExposure.reduceForDustExposure(localSpecWithoutNewHtlcs, commitments.localChanges.all, commitments.remoteChanges.acked) - val localCommitDustExposure = DustExposure.computeExposure(localReduced, commitments.localParams.dustLimit, commitments.commitmentFormat) - val remoteReduced = DustExposure.reduceForDustExposure(remoteSpecWithoutNewHtlcs, commitments.remoteChanges.acked, commitments.localChanges.all) - val remoteCommitDustExposure = DustExposure.computeExposure(remoteReduced, commitments.remoteParams.dustLimit, commitments.commitmentFormat) + val localReduced = HtlcFiltering.reduceForHtlcFiltering(localSpecWithoutNewHtlcs, commitments.localChanges.all, commitments.remoteChanges.acked) + val remoteReduced = HtlcFiltering.reduceForHtlcFiltering(remoteSpecWithoutNewHtlcs, commitments.remoteChanges.acked, commitments.localChanges.all) // we sort incoming htlcs by decreasing amount: we want to prioritize higher amounts. - val sortedReceivedHtlcs = receivedHtlcs.sortBy(_.amountMsat).reverse - DustExposure.filterBeforeForward( + val sortedReceivedHtlcs = FilteredHtlcs(receivedHtlcs.sortBy(_.amountMsat).reverse, Seq.empty) + // we start by filtering htlcs that would overflow our dust exposure + val filteredForDust = DustExposure.filterBeforeForward( maxDustExposure, localReduced, commitments.localParams.dustLimit, - localCommitDustExposure, + DustExposure.computeExposure(localReduced, commitments.localParams.dustLimit, commitments.commitmentFormat), remoteReduced, commitments.remoteParams.dustLimit, - remoteCommitDustExposure, + DustExposure.computeExposure(remoteReduced, commitments.remoteParams.dustLimit, commitments.commitmentFormat), sortedReceivedHtlcs, commitments.commitmentFormat) + // we then apply congestion control limits to the remaining htlcs + ChannelCongestionControl.filterBeforeForward( + localReduced, + commitments.localParams.dustLimit, + commitments.localParams.maxAcceptedHtlcs, + remoteReduced, + commitments.remoteParams.dustLimit, + filteredForDust, + commitments.localParams.maxHtlcValueInFlightMsat, + commitments.commitmentFormat) } - val actions = acceptedHtlcs.map(add => PostRevocationAction.RelayHtlc(add)) ++ - rejectedHtlcs.map(add => PostRevocationAction.RejectHtlc(add)) ++ + val actions = filteredHtlcs.accepted.map(add => PostRevocationAction.RelayHtlc(add)) ++ + filteredHtlcs.rejected.map(add => PostRevocationAction.RejectHtlc(add)) ++ failedHtlcs.map(res => PostRevocationAction.RelayFailure(res)) // the outgoing following htlcs have been completed (fulfilled or failed) when we received this revocation // they have been removed from both local and remote commitment diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/channel/DustExposure.scala b/eclair-core/src/main/scala/fr/acinq/eclair/channel/DustExposure.scala index 2279e87ec1..525c6ab50b 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/channel/DustExposure.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/channel/DustExposure.scala @@ -19,9 +19,9 @@ package fr.acinq.eclair.channel import fr.acinq.bitcoin.scalacompat.{Satoshi, SatoshiLong} import fr.acinq.eclair.MilliSatoshi import fr.acinq.eclair.blockchain.fee.{FeeratePerByte, FeeratePerKw} +import fr.acinq.eclair.channel.HtlcFiltering.FilteredHtlcs import fr.acinq.eclair.transactions.Transactions.CommitmentFormat import fr.acinq.eclair.transactions._ -import fr.acinq.eclair.wire.protocol._ /** * Created by t-bast on 07/10/2021. @@ -74,82 +74,23 @@ object DustExposure { remoteSpec: CommitmentSpec, remoteDustLimit: Satoshi, remoteCommitDustExposure: MilliSatoshi, - receivedHtlcs: Seq[UpdateAddHtlc], - commitmentFormat: CommitmentFormat): (Seq[UpdateAddHtlc], Seq[UpdateAddHtlc]) = { - val (_, _, acceptedHtlcs, rejectedHtlcs) = receivedHtlcs.foldLeft((localCommitDustExposure, remoteCommitDustExposure, Seq.empty[UpdateAddHtlc], Seq.empty[UpdateAddHtlc])) { - case ((currentLocalCommitDustExposure, currentRemoteCommitDustExposure, acceptedHtlcs, rejectedHtlcs), add) => + receivedHtlcs: FilteredHtlcs, + commitmentFormat: CommitmentFormat): FilteredHtlcs = { + val (_, _, result) = receivedHtlcs.accepted.foldLeft((localCommitDustExposure, remoteCommitDustExposure, receivedHtlcs.copy(accepted = Seq.empty))) { + case ((currentLocalCommitDustExposure, currentRemoteCommitDustExposure, currentHtlcs), add) => val contributesToLocalCommitDustExposure = contributesToDustExposure(IncomingHtlc(add), localSpec, localDustLimit, commitmentFormat) val overflowsLocalCommitDustExposure = contributesToLocalCommitDustExposure && currentLocalCommitDustExposure + add.amountMsat > maxDustExposure val contributesToRemoteCommitDustExposure = contributesToDustExposure(OutgoingHtlc(add), remoteSpec, remoteDustLimit, commitmentFormat) val overflowsRemoteCommitDustExposure = contributesToRemoteCommitDustExposure && currentRemoteCommitDustExposure + add.amountMsat > maxDustExposure if (overflowsLocalCommitDustExposure || overflowsRemoteCommitDustExposure) { - (currentLocalCommitDustExposure, currentRemoteCommitDustExposure, acceptedHtlcs, rejectedHtlcs :+ add) + (currentLocalCommitDustExposure, currentRemoteCommitDustExposure, currentHtlcs.reject(add)) } else { val nextLocalCommitDustExposure = if (contributesToLocalCommitDustExposure) currentLocalCommitDustExposure + add.amountMsat else currentLocalCommitDustExposure val nextRemoteCommitDustExposure = if (contributesToRemoteCommitDustExposure) currentRemoteCommitDustExposure + add.amountMsat else currentRemoteCommitDustExposure - (nextLocalCommitDustExposure, nextRemoteCommitDustExposure, acceptedHtlcs :+ add, rejectedHtlcs) + (nextLocalCommitDustExposure, nextRemoteCommitDustExposure, currentHtlcs.accept(add)) } } - (acceptedHtlcs, rejectedHtlcs) - } - - def reduceForDustExposure(localCommitSpec: CommitmentSpec, localChanges: List[UpdateMessage], remoteChanges: List[UpdateMessage]): CommitmentSpec = { - // NB: when computing dust exposure, we usually apply all pending updates (proposed, signed and acked), which means - // that we will sometimes apply fulfill/fail on htlcs that have already been removed: that's why we don't use the - // normal functions from CommitmentSpec that would throw when that happens. - def fulfillIncomingHtlc(spec: CommitmentSpec, htlcId: Long): CommitmentSpec = { - spec.findIncomingHtlcById(htlcId) match { - case Some(htlc) => spec.copy(toLocal = spec.toLocal + htlc.add.amountMsat, htlcs = spec.htlcs - htlc) - case None => spec - } - } - - def fulfillOutgoingHtlc(spec: CommitmentSpec, htlcId: Long): CommitmentSpec = { - spec.findOutgoingHtlcById(htlcId) match { - case Some(htlc) => spec.copy(toRemote = spec.toRemote + htlc.add.amountMsat, htlcs = spec.htlcs - htlc) - case None => spec - } - } - - def failIncomingHtlc(spec: CommitmentSpec, htlcId: Long): CommitmentSpec = { - spec.findIncomingHtlcById(htlcId) match { - case Some(htlc) => spec.copy(toRemote = spec.toRemote + htlc.add.amountMsat, htlcs = spec.htlcs - htlc) - case None => spec - } - } - - def failOutgoingHtlc(spec: CommitmentSpec, htlcId: Long): CommitmentSpec = { - spec.findOutgoingHtlcById(htlcId) match { - case Some(htlc) => spec.copy(toLocal = spec.toLocal + htlc.add.amountMsat, htlcs = spec.htlcs - htlc) - case None => spec - } - } - - val spec1 = localChanges.foldLeft(localCommitSpec) { - case (spec, u: UpdateAddHtlc) => CommitmentSpec.addHtlc(spec, OutgoingHtlc(u)) - case (spec, _) => spec - } - val spec2 = remoteChanges.foldLeft(spec1) { - case (spec, u: UpdateAddHtlc) => CommitmentSpec.addHtlc(spec, IncomingHtlc(u)) - case (spec, _) => spec - } - val spec3 = localChanges.foldLeft(spec2) { - case (spec, u: UpdateFulfillHtlc) => fulfillIncomingHtlc(spec, u.id) - case (spec, u: UpdateFailHtlc) => failIncomingHtlc(spec, u.id) - case (spec, u: UpdateFailMalformedHtlc) => failIncomingHtlc(spec, u.id) - case (spec, _) => spec - } - val spec4 = remoteChanges.foldLeft(spec3) { - case (spec, u: UpdateFulfillHtlc) => fulfillOutgoingHtlc(spec, u.id) - case (spec, u: UpdateFailHtlc) => failOutgoingHtlc(spec, u.id) - case (spec, u: UpdateFailMalformedHtlc) => failOutgoingHtlc(spec, u.id) - case (spec, _) => spec - } - val spec5 = (localChanges ++ remoteChanges).foldLeft(spec4) { - case (spec, u: UpdateFee) => spec.copy(commitTxFeerate = u.feeratePerKw) - case (spec, _) => spec - } - spec5 + result } } diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/channel/HtlcFiltering.scala b/eclair-core/src/main/scala/fr/acinq/eclair/channel/HtlcFiltering.scala new file mode 100644 index 0000000000..e14111551a --- /dev/null +++ b/eclair-core/src/main/scala/fr/acinq/eclair/channel/HtlcFiltering.scala @@ -0,0 +1,99 @@ +/* + * Copyright 2022 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.channel + +import fr.acinq.eclair.transactions.{CommitmentSpec, IncomingHtlc, OutgoingHtlc} +import fr.acinq.eclair.wire.protocol._ + +/** + * Created by t-bast on 22/06/2022. + */ + +/** + * We may want to apply implementation-specific rate limits before forwarding HTLCs that would otherwise be valid + * according to the specification (e.g. to protect against a large dust exposure or rate limit HTLCs based on their + * amount). + */ +object HtlcFiltering { + + case class FilteredHtlcs(accepted: Seq[UpdateAddHtlc], rejected: Seq[UpdateAddHtlc]) { + // @formatter:off + def accept(add: UpdateAddHtlc): FilteredHtlcs = FilteredHtlcs(accepted :+ add, rejected) + def reject(add: UpdateAddHtlc): FilteredHtlcs = FilteredHtlcs(accepted, rejected :+ add) + // @formatter:on + } + + // NB: when filtering htlcs, we want to apply all pending updates (proposed, signed and acked), which means that we + // will sometimes apply fulfill/fail on htlcs that have already been removed: that's why we don't use the normal + // functions from CommitmentSpec that would throw when that happens. + def reduceForHtlcFiltering(localCommitSpec: CommitmentSpec, localChanges: List[UpdateMessage], remoteChanges: List[UpdateMessage]): CommitmentSpec = { + def fulfillIncomingHtlc(spec: CommitmentSpec, htlcId: Long): CommitmentSpec = { + spec.findIncomingHtlcById(htlcId) match { + case Some(htlc) => spec.copy(toLocal = spec.toLocal + htlc.add.amountMsat, htlcs = spec.htlcs - htlc) + case None => spec + } + } + + def fulfillOutgoingHtlc(spec: CommitmentSpec, htlcId: Long): CommitmentSpec = { + spec.findOutgoingHtlcById(htlcId) match { + case Some(htlc) => spec.copy(toRemote = spec.toRemote + htlc.add.amountMsat, htlcs = spec.htlcs - htlc) + case None => spec + } + } + + def failIncomingHtlc(spec: CommitmentSpec, htlcId: Long): CommitmentSpec = { + spec.findIncomingHtlcById(htlcId) match { + case Some(htlc) => spec.copy(toRemote = spec.toRemote + htlc.add.amountMsat, htlcs = spec.htlcs - htlc) + case None => spec + } + } + + def failOutgoingHtlc(spec: CommitmentSpec, htlcId: Long): CommitmentSpec = { + spec.findOutgoingHtlcById(htlcId) match { + case Some(htlc) => spec.copy(toLocal = spec.toLocal + htlc.add.amountMsat, htlcs = spec.htlcs - htlc) + case None => spec + } + } + + val spec1 = localChanges.foldLeft(localCommitSpec) { + case (spec, u: UpdateAddHtlc) => CommitmentSpec.addHtlc(spec, OutgoingHtlc(u)) + case (spec, _) => spec + } + val spec2 = remoteChanges.foldLeft(spec1) { + case (spec, u: UpdateAddHtlc) => CommitmentSpec.addHtlc(spec, IncomingHtlc(u)) + case (spec, _) => spec + } + val spec3 = localChanges.foldLeft(spec2) { + case (spec, u: UpdateFulfillHtlc) => fulfillIncomingHtlc(spec, u.id) + case (spec, u: UpdateFailHtlc) => failIncomingHtlc(spec, u.id) + case (spec, u: UpdateFailMalformedHtlc) => failIncomingHtlc(spec, u.id) + case (spec, _) => spec + } + val spec4 = remoteChanges.foldLeft(spec3) { + case (spec, u: UpdateFulfillHtlc) => fulfillOutgoingHtlc(spec, u.id) + case (spec, u: UpdateFailHtlc) => failOutgoingHtlc(spec, u.id) + case (spec, u: UpdateFailMalformedHtlc) => failOutgoingHtlc(spec, u.id) + case (spec, _) => spec + } + val spec5 = (localChanges ++ remoteChanges).foldLeft(spec4) { + case (spec, u: UpdateFee) => spec.copy(commitTxFeerate = u.feeratePerKw) + case (spec, _) => spec + } + spec5 + } + +} diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/payment/relay/ChannelRelay.scala b/eclair-core/src/main/scala/fr/acinq/eclair/payment/relay/ChannelRelay.scala index cec325e1df..f133691de9 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/payment/relay/ChannelRelay.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/payment/relay/ChannelRelay.scala @@ -72,6 +72,7 @@ object ChannelRelay { case (_: HtlcValueTooHighInFlight, Some(channelUpdate)) => TemporaryChannelFailure(channelUpdate) case (_: LocalDustHtlcExposureTooHigh, Some(channelUpdate)) => TemporaryChannelFailure(channelUpdate) case (_: RemoteDustHtlcExposureTooHigh, Some(channelUpdate)) => TemporaryChannelFailure(channelUpdate) + case (_: HtlcRejectedByCongestionControl, Some(channelUpdate)) => TemporaryChannelFailure(channelUpdate) case (_: FeerateTooDifferent, Some(channelUpdate)) => TemporaryChannelFailure(channelUpdate) case (_: ChannelUnavailable, Some(channelUpdate)) if !channelUpdate.channelFlags.isEnabled => ChannelDisabled(channelUpdate.messageFlags, channelUpdate.channelFlags, channelUpdate) case (_: ChannelUnavailable, None) => PermanentChannelFailure diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/channel/ChannelCongestionControlSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/channel/ChannelCongestionControlSpec.scala new file mode 100644 index 0000000000..2419df4cd9 --- /dev/null +++ b/eclair-core/src/test/scala/fr/acinq/eclair/channel/ChannelCongestionControlSpec.scala @@ -0,0 +1,207 @@ +/* + * Copyright 2022 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.channel + +import fr.acinq.bitcoin.scalacompat.{ByteVector32, SatoshiLong} +import fr.acinq.eclair.blockchain.fee.FeeratePerKw +import fr.acinq.eclair.channel.ChannelCongestionControl.CongestionConfig +import fr.acinq.eclair.channel.HtlcFiltering.FilteredHtlcs +import fr.acinq.eclair.transactions.Transactions.ZeroFeeHtlcTxAnchorOutputsCommitmentFormat +import fr.acinq.eclair.transactions.{CommitmentSpec, IncomingHtlc, OutgoingHtlc} +import fr.acinq.eclair.wire.protocol.UpdateAddHtlc +import fr.acinq.eclair.{CltvExpiry, MilliSatoshi, MilliSatoshiLong, TestConstants, ToMilliSatoshiConversion, randomBytes32} +import org.scalatest.funsuite.AnyFunSuiteLike + +class ChannelCongestionControlSpec extends AnyFunSuiteLike { + + implicit val log: akka.event.LoggingAdapter = akka.event.NoLogging + + def createHtlc(id: Long, amount: MilliSatoshi): UpdateAddHtlc = { + UpdateAddHtlc(ByteVector32.Zeroes, id, amount, randomBytes32(), CltvExpiry(500), TestConstants.emptyOnionPacket) + } + + test("reject htlcs when buckets are full") { + val maxAcceptedTests = Seq(30, 50, 100, 200, 300, 483) + val maxInFlightTests = Seq( + 100_000_000L msat, + 250_000_000L msat, + 500_000_000L msat, + 750_000_000L msat, + 1_000_000_000L msat, + 5_000_000_000L msat, + 10_000_000_000L msat, + 50_000_000_000L msat, + 100_000_000_000L msat, + 200_000_000_000L msat, + 300_000_000_000L msat, + 400_000_000_000L msat, + 500_000_000_000L msat, + ) + maxAcceptedTests.foreach { maxAcceptedHtlcs => + maxInFlightTests.foreach { maxHtlcValueInFlight => + val cfg = CongestionConfig(maxAcceptedHtlcs, maxHtlcValueInFlight) + assert(cfg.buckets.length == 3) + // We start with an empty channel. + val dustLimit = 330 sat + var htlcCount = 0 + var amountLocked = 0 msat + var localSpec = CommitmentSpec(Set.empty, FeeratePerKw(0 sat), maxHtlcValueInFlight * 2, maxHtlcValueInFlight * 2) + var remoteSpec = CommitmentSpec(Set.empty, FeeratePerKw(0 sat), maxHtlcValueInFlight * 2, maxHtlcValueInFlight * 2) + + def addHtlc(htlcAmount: MilliSatoshi): Unit = { + val add = createHtlc(htlcCount, htlcAmount) + localSpec = CommitmentSpec.addHtlc(localSpec, OutgoingHtlc(add)) + remoteSpec = CommitmentSpec.addHtlc(remoteSpec, IncomingHtlc(add)) + } + + def fillBucket(htlcAmount: MilliSatoshi): Unit = { + while (ChannelCongestionControl.shouldSendHtlc(createHtlc(htlcCount, htlcAmount), localSpec, dustLimit, maxAcceptedHtlcs, remoteSpec, dustLimit, maxAcceptedHtlcs, maxHtlcValueInFlight, ZeroFeeHtlcTxAnchorOutputsCommitmentFormat)) { + addHtlc(htlcAmount) + htlcCount += 1 + amountLocked += htlcAmount + } + } + + // We fill the first bucket with htlcs at the dust limit. + fillBucket(dustLimit.toMilliSatoshi) + assert(htlcCount == cfg.buckets.head.size) + assert(htlcCount < maxAcceptedHtlcs) + assert(!ChannelCongestionControl.shouldSendHtlc(createHtlc(htlcCount, cfg.buckets.head.threshold), localSpec, dustLimit, maxAcceptedHtlcs, remoteSpec, dustLimit, maxAcceptedHtlcs, maxHtlcValueInFlight, ZeroFeeHtlcTxAnchorOutputsCommitmentFormat)) + // We fill the second bucket with the lowest htlc amount allowed in that bucket. + fillBucket(cfg.buckets.head.threshold + 1.msat) + assert(htlcCount == cfg.buckets(1).size) + assert(htlcCount < maxAcceptedHtlcs) + assert(!ChannelCongestionControl.shouldSendHtlc(createHtlc(htlcCount, cfg.buckets(1).threshold), localSpec, dustLimit, maxAcceptedHtlcs, remoteSpec, dustLimit, maxAcceptedHtlcs, maxHtlcValueInFlight, ZeroFeeHtlcTxAnchorOutputsCommitmentFormat)) + // We fill the third bucket with the lowest htlc amount allowed in that bucket. + fillBucket(cfg.buckets(1).threshold + 1.msat) + assert(htlcCount == cfg.buckets(2).size) + assert(htlcCount < maxAcceptedHtlcs) + assert(!ChannelCongestionControl.shouldSendHtlc(createHtlc(htlcCount, cfg.buckets(2).threshold), localSpec, dustLimit, maxAcceptedHtlcs, remoteSpec, dustLimit, maxAcceptedHtlcs, maxHtlcValueInFlight, ZeroFeeHtlcTxAnchorOutputsCommitmentFormat)) + // We fill the remaining htlc slots with the lowest htlc amount allowed for the last bucket. + while (htlcCount < maxAcceptedHtlcs) { + val amount = cfg.buckets(2).threshold + 1.msat + assert(ChannelCongestionControl.shouldSendHtlc(createHtlc(htlcCount, amount), localSpec, dustLimit, maxAcceptedHtlcs, remoteSpec, dustLimit, maxAcceptedHtlcs, maxHtlcValueInFlight, ZeroFeeHtlcTxAnchorOutputsCommitmentFormat)) + addHtlc(amount) + htlcCount += 1 + amountLocked += amount + } + assert(htlcCount == maxAcceptedHtlcs) + assert(amountLocked > maxHtlcValueInFlight * 0.5, s"max-accepted = $maxAcceptedHtlcs, max-in-flight = $maxHtlcValueInFlight, amount-locked = $amountLocked, ratio = ${amountLocked.toLong.toDouble / maxHtlcValueInFlight.toLong}") + } + } + } + + test("different local and remote limits") { + val localMaxAccepted = 10 + val localDustLimit = 330 sat + val remoteMaxAccepted = 20 + val remoteDustLimit = 660 sat + val maxInFlight = 250_000_000 msat + var localSpec = CommitmentSpec(Set.empty, FeeratePerKw(0 sat), 500_000_000 msat, 500_000_000 msat) + var remoteSpec = CommitmentSpec(Set.empty, FeeratePerKw(0 sat), 500_000_000 msat, 500_000_000 msat) + // We can send as many HTLCs below dust as we want. + (1 to 25).foreach(i => { + val add = createHtlc(i, 300_000 msat) + assert(ChannelCongestionControl.shouldSendHtlc(add, localSpec, localDustLimit, localMaxAccepted, remoteSpec, remoteDustLimit, remoteMaxAccepted, maxInFlight, ZeroFeeHtlcTxAnchorOutputsCommitmentFormat)) + localSpec = CommitmentSpec.addHtlc(localSpec, OutgoingHtlc(add)) + remoteSpec = CommitmentSpec.addHtlc(remoteSpec, IncomingHtlc(add)) + }) + // We enforce the most restricting limits for HTLCs above dust: the first local bucket allows only 5 tiny htlcs. + (26 to 30).foreach(i => { + val add = createHtlc(i, 330_000 msat) + assert(ChannelCongestionControl.shouldSendHtlc(add, localSpec, localDustLimit, localMaxAccepted, remoteSpec, remoteDustLimit, remoteMaxAccepted, maxInFlight, ZeroFeeHtlcTxAnchorOutputsCommitmentFormat)) + localSpec = CommitmentSpec.addHtlc(localSpec, OutgoingHtlc(add)) + remoteSpec = CommitmentSpec.addHtlc(remoteSpec, IncomingHtlc(add)) + }) + val rejectedHtlc = createHtlc(50, 330_000 msat) + assert(!ChannelCongestionControl.shouldSendHtlc(rejectedHtlc, localSpec, localDustLimit, localMaxAccepted, remoteSpec, remoteDustLimit, remoteMaxAccepted, maxInFlight, ZeroFeeHtlcTxAnchorOutputsCommitmentFormat)) + } + + test("filter htlcs before forwarding") { + val maxAccepted = 10 + val maxInFlight = 250_000_000 msat + val dustLimit = 500 sat + val localSpec = CommitmentSpec(Set.empty, FeeratePerKw(0 sat), 500_000_000 msat, 500_000_000 msat) + val remoteSpec = CommitmentSpec(Set.empty, FeeratePerKw(0 sat), 500_000_000 msat, 500_000_000 msat) + + { + val received = FilteredHtlcs( + accepted = Seq( + // HTLCs for the first bucket: + createHtlc(0, 500_000 msat), + createHtlc(1, 500_000 msat), + createHtlc(2, 500_000 msat), + createHtlc(3, 500_000 msat), + createHtlc(4, 500_000 msat), + createHtlc(5, 500_000 msat), + createHtlc(6, 500_000 msat), + createHtlc(7, 500_000 msat), + // HTLCs for the second bucket: + createHtlc(8, 5_000_000 msat), + createHtlc(9, 5_000_000 msat), + createHtlc(10, 5_000_000 msat), + createHtlc(11, 5_000_000 msat), + createHtlc(12, 5_000_000 msat), + // HTLCs for the third bucket: + createHtlc(13, 20_000_000 msat), + createHtlc(14, 20_000_000 msat), + createHtlc(15, 20_000_000 msat), + // Unrestricted HTLCs: + createHtlc(16, 50_000_000 msat), + ), + rejected = Seq( + createHtlc(100, 2_000 msat), + createHtlc(101, 3_000 msat), + ) + ) + val filtered = ChannelCongestionControl.filterBeforeForward(localSpec, dustLimit, maxAccepted, remoteSpec, dustLimit, received, maxInFlight, ZeroFeeHtlcTxAnchorOutputsCommitmentFormat) + assert(filtered.accepted.map(_.id).toSet == Set(0, 1, 2, 3, 4, 8, 9, 10, 13, 16)) + assert(filtered.rejected.map(_.id).toSet == Set(5, 6, 7, 11, 12, 14, 15, 100, 101)) + } + { + val received = FilteredHtlcs( + accepted = Seq( + // HTLCs for the third bucket: + createHtlc(0, 20_000_000 msat), + createHtlc(1, 20_000_000 msat), + createHtlc(2, 20_000_000 msat), + createHtlc(3, 20_000_000 msat), + createHtlc(4, 20_000_000 msat), + createHtlc(5, 20_000_000 msat), + createHtlc(6, 20_000_000 msat), + createHtlc(7, 20_000_000 msat), + createHtlc(8, 20_000_000 msat), + createHtlc(9, 20_000_000 msat), + // HTLCs for the second bucket: + createHtlc(10, 5_000_000 msat), + createHtlc(11, 5_000_000 msat), + // HTLCs for the first bucket: + createHtlc(12, 500_000 msat), + createHtlc(13, 500_000 msat), + ), + rejected = Seq( + createHtlc(100, 2_000 msat), + createHtlc(101, 3_000 msat), + ) + ) + val filtered = ChannelCongestionControl.filterBeforeForward(localSpec, dustLimit, maxAccepted, remoteSpec, dustLimit, received, maxInFlight, ZeroFeeHtlcTxAnchorOutputsCommitmentFormat) + assert(filtered.accepted.map(_.id).toSet == Set(0, 1, 2, 3, 4, 5, 6, 7, 8)) + assert(filtered.rejected.map(_.id).toSet == Set(9, 10, 11, 12, 13, 100, 101)) + } + } + +} diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/channel/DustExposureSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/channel/DustExposureSpec.scala index c277653adc..0f08633e9c 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/channel/DustExposureSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/channel/DustExposureSpec.scala @@ -18,6 +18,7 @@ package fr.acinq.eclair.channel import fr.acinq.bitcoin.scalacompat.{ByteVector32, SatoshiLong} import fr.acinq.eclair.blockchain.fee.{FeeratePerByte, FeeratePerKw} +import fr.acinq.eclair.channel.HtlcFiltering.FilteredHtlcs import fr.acinq.eclair.transactions._ import fr.acinq.eclair.wire.protocol.UpdateAddHtlc import fr.acinq.eclair.{CltvExpiry, MilliSatoshi, MilliSatoshiLong, TestConstants, ToMilliSatoshiConversion, randomBytes32} @@ -130,17 +131,17 @@ class DustExposureSpec extends AnyFunSuiteLike { )) assert(DustExposure.computeExposure(updatedSpec, dustLimit, Transactions.DefaultCommitmentFormat) == 18500.sat.toMilliSatoshi) - val receivedHtlcs = Seq( + val receivedHtlcs = FilteredHtlcs(Seq( createHtlc(5, 9500.sat.toMilliSatoshi), createHtlc(6, 5000.sat.toMilliSatoshi), createHtlc(7, 1000.sat.toMilliSatoshi), createHtlc(8, 400.sat.toMilliSatoshi), createHtlc(9, 400.sat.toMilliSatoshi), createHtlc(10, 50000.sat.toMilliSatoshi), - ) - val (accepted, rejected) = DustExposure.filterBeforeForward(25000 sat, updatedSpec, dustLimit, 10000.sat.toMilliSatoshi, initialSpec, dustLimit, 15000.sat.toMilliSatoshi, receivedHtlcs, Transactions.DefaultCommitmentFormat) - assert(accepted.map(_.id).toSet == Set(5, 6, 8, 10)) - assert(rejected.map(_.id).toSet == Set(7, 9)) + ), Seq.empty) + val filtered = DustExposure.filterBeforeForward(25000 sat, updatedSpec, dustLimit, 10000.sat.toMilliSatoshi, initialSpec, dustLimit, 15000.sat.toMilliSatoshi, receivedHtlcs, Transactions.DefaultCommitmentFormat) + assert(filtered.accepted.map(_.id).toSet == Set(5, 6, 8, 10)) + assert(filtered.rejected.map(_.id).toSet == Set(7, 9)) } } diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/ChannelStateTestsHelperMethods.scala b/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/ChannelStateTestsHelperMethods.scala index 2670b9f7fb..7b70416af1 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/ChannelStateTestsHelperMethods.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/channel/states/ChannelStateTestsHelperMethods.scala @@ -63,8 +63,16 @@ object ChannelStateTestsTags { val NoPushMsat = "no_push_msat" /** If set, max-htlc-value-in-flight will be set to the highest possible value for Alice and Bob. */ val NoMaxHtlcValueInFlight = "no_max_htlc_value_in_flight" + /** If set, max-accepted-htlcs will be set to the highest possible value for Alice and Bob. */ + val HighMaxAcceptedHtlcs = "high_max_accepted_htlcs" + /** If set, max-accepted-htlcs will be set to 5 for Alice. */ + val AliceLowMaxAcceptedHtlcs = "alice_low_max_accepted_htlcs" + /** If set, max-accepted-htlcs will be set to 5 for Bob. */ + val BobLowMaxAcceptedHtlcs = "bob_low_max_accepted_htlcs" /** If set, max-htlc-value-in-flight will be set to a low value for Alice. */ val AliceLowMaxHtlcValueInFlight = "alice_low_max_htlc_value_in_flight" + /** If set, max-htlc-value-in-flight will be set to a low value for Bob. */ + val BobLowMaxHtlcValueInFlight = "bob_low_max_htlc_value_in_flight" /** If set, channels will use option_upfront_shutdown_script. */ val UpfrontShutdownScript = "option_upfront_shutdown_script" /** If set, Alice will have a much higher dust limit than Bob. */ @@ -135,11 +143,15 @@ trait ChannelStateTestsBase extends Assertions with Eventually { .modify(_.channelConf.dustLimit).setToIf(tags.contains(ChannelStateTestsTags.HighDustLimitDifferenceBobAlice))(1000 sat) .modify(_.channelConf.maxRemoteDustLimit).setToIf(tags.contains(ChannelStateTestsTags.HighDustLimitDifferenceAliceBob))(10000 sat) .modify(_.channelConf.maxRemoteDustLimit).setToIf(tags.contains(ChannelStateTestsTags.HighDustLimitDifferenceBobAlice))(10000 sat) + .modify(_.channelConf.maxAcceptedHtlcs).setToIf(tags.contains(ChannelStateTestsTags.HighMaxAcceptedHtlcs))(483) + .modify(_.channelConf.maxAcceptedHtlcs).setToIf(tags.contains(ChannelStateTestsTags.AliceLowMaxAcceptedHtlcs))(5) val finalNodeParamsB = nodeParamsB .modify(_.channelConf.dustLimit).setToIf(tags.contains(ChannelStateTestsTags.HighDustLimitDifferenceAliceBob))(1000 sat) .modify(_.channelConf.dustLimit).setToIf(tags.contains(ChannelStateTestsTags.HighDustLimitDifferenceBobAlice))(5000 sat) .modify(_.channelConf.maxRemoteDustLimit).setToIf(tags.contains(ChannelStateTestsTags.HighDustLimitDifferenceAliceBob))(10000 sat) .modify(_.channelConf.maxRemoteDustLimit).setToIf(tags.contains(ChannelStateTestsTags.HighDustLimitDifferenceBobAlice))(10000 sat) + .modify(_.channelConf.maxAcceptedHtlcs).setToIf(tags.contains(ChannelStateTestsTags.HighMaxAcceptedHtlcs))(483) + .modify(_.channelConf.maxAcceptedHtlcs).setToIf(tags.contains(ChannelStateTestsTags.BobLowMaxAcceptedHtlcs))(5) val alice: TestFSMRef[ChannelState, ChannelData, Channel] = { implicit val system: ActorSystem = systemA TestFSMRef(new Channel(finalNodeParamsA, wallet, finalNodeParamsB.nodeId, alice2blockchain.ref, alice2relayer.ref, FakeTxPublisherFactory(alice2blockchain), origin_opt = Some(aliceOrigin.ref)), alicePeer.ref) @@ -191,12 +203,17 @@ trait ChannelStateTestsBase extends Assertions with Eventually { .modify(_.maxHtlcValueInFlightMsat).setToIf(tags.contains(ChannelStateTestsTags.AliceLowMaxHtlcValueInFlight))(150_000_000 msat) .modify(_.dustLimit).setToIf(tags.contains(ChannelStateTestsTags.HighDustLimitDifferenceAliceBob))(5000 sat) .modify(_.dustLimit).setToIf(tags.contains(ChannelStateTestsTags.HighDustLimitDifferenceBobAlice))(1000 sat) + .modify(_.maxAcceptedHtlcs).setToIf(tags.contains(ChannelStateTestsTags.HighMaxAcceptedHtlcs))(483) + .modify(_.maxAcceptedHtlcs).setToIf(tags.contains(ChannelStateTestsTags.AliceLowMaxAcceptedHtlcs))(5) val bobParams = Bob.channelParams .modify(_.initFeatures).setTo(bobInitFeatures) .modify(_.walletStaticPaymentBasepoint).setToIf(channelType.paysDirectlyToWallet)(Some(Await.result(wallet.getReceivePubkey(), 10 seconds))) .modify(_.maxHtlcValueInFlightMsat).setToIf(tags.contains(ChannelStateTestsTags.NoMaxHtlcValueInFlight))(Long.MaxValue.msat) + .modify(_.maxHtlcValueInFlightMsat).setToIf(tags.contains(ChannelStateTestsTags.BobLowMaxHtlcValueInFlight))(150_000_000 msat) .modify(_.dustLimit).setToIf(tags.contains(ChannelStateTestsTags.HighDustLimitDifferenceAliceBob))(1000 sat) .modify(_.dustLimit).setToIf(tags.contains(ChannelStateTestsTags.HighDustLimitDifferenceBobAlice))(5000 sat) + .modify(_.maxAcceptedHtlcs).setToIf(tags.contains(ChannelStateTestsTags.HighMaxAcceptedHtlcs))(483) + .modify(_.maxAcceptedHtlcs).setToIf(tags.contains(ChannelStateTestsTags.BobLowMaxAcceptedHtlcs))(5) (aliceParams, bobParams, channelType) } 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 164b5fc21b..1b8ca39be9 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 @@ -341,20 +341,20 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with alice2bob.expectNoMessage(200 millis) } - test("recv CMD_ADD_HTLC (over remote max accepted htlcs)") { f => + test("recv CMD_ADD_HTLC (over remote max accepted htlcs)", Tag(ChannelStateTestsTags.BobLowMaxAcceptedHtlcs)) { f => import f._ val sender = TestProbe() val initialState = alice.stateData.asInstanceOf[DATA_NORMAL] assert(initialState.commitments.localParams.maxAcceptedHtlcs == 100) - assert(initialState.commitments.remoteParams.maxAcceptedHtlcs == 30) // Bob accepts a maximum of 30 htlcs - for (_ <- 0 until 30) { - alice ! CMD_ADD_HTLC(sender.ref, 10000000 msat, randomBytes32(), CltvExpiryDelta(144).toCltvExpiry(currentBlockHeight), TestConstants.emptyOnionPacket, localOrigin(sender.ref)) + assert(initialState.commitments.remoteParams.maxAcceptedHtlcs == 5) // Bob accepts a maximum of 5 htlcs + for (_ <- 0 until 5) { + alice ! CMD_ADD_HTLC(sender.ref, 60000000 msat, randomBytes32(), CltvExpiryDelta(144).toCltvExpiry(currentBlockHeight), TestConstants.emptyOnionPacket, localOrigin(sender.ref)) sender.expectMsgType[RES_SUCCESS[CMD_ADD_HTLC]] alice2bob.expectMsgType[UpdateAddHtlc] } - val add = CMD_ADD_HTLC(sender.ref, 10000000 msat, randomBytes32(), CltvExpiryDelta(144).toCltvExpiry(currentBlockHeight), TestConstants.emptyOnionPacket, localOrigin(sender.ref)) + val add = CMD_ADD_HTLC(sender.ref, 60000000 msat, randomBytes32(), CltvExpiryDelta(144).toCltvExpiry(currentBlockHeight), TestConstants.emptyOnionPacket, localOrigin(sender.ref)) alice ! add - val error = TooManyAcceptedHtlcs(channelId(alice), maximum = 30) + val error = TooManyAcceptedHtlcs(channelId(alice), maximum = 5) sender.expectMsg(RES_ADD_FAILED(add, error, Some(initialState.channelUpdate))) alice2bob.expectNoMessage(200 millis) } @@ -377,6 +377,25 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with bob2alice.expectNoMessage(200 millis) } + test("recv CMD_ADD_HTLC (channel congestion protection)") { f => + import f._ + val sender = TestProbe() + val initialState = bob.stateData.asInstanceOf[DATA_NORMAL] + // We can send at most 30 HTLCs, but we will be more restrictive for small HTLCs. + assert(initialState.commitments.localParams.maxAcceptedHtlcs == 30) + assert(initialState.commitments.remoteParams.maxAcceptedHtlcs == 100) + for (_ <- 0 until 15) { + bob ! CMD_ADD_HTLC(sender.ref, 10_000_000 msat, randomBytes32(), CltvExpiryDelta(144).toCltvExpiry(currentBlockHeight), TestConstants.emptyOnionPacket, localOrigin(sender.ref)) + sender.expectMsgType[RES_SUCCESS[CMD_ADD_HTLC]] + bob2alice.expectMsgType[UpdateAddHtlc] + } + val add = CMD_ADD_HTLC(sender.ref, 10_000_000 msat, randomBytes32(), CltvExpiryDelta(144).toCltvExpiry(currentBlockHeight), TestConstants.emptyOnionPacket, localOrigin(sender.ref)) + bob ! add + val error = HtlcRejectedByCongestionControl(channelId(bob), add.amount) + sender.expectMsg(RES_ADD_FAILED(add, error, Some(initialState.channelUpdate))) + bob2alice.expectNoMessage(200 millis) + } + test("recv CMD_ADD_HTLC (over max dust htlc exposure)") { f => import f._ val sender = TestProbe() @@ -445,7 +464,7 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with sender.expectMsg(RES_ADD_FAILED(add, LocalDustHtlcExposureTooHigh(channelId(alice), 25000.sat, 25001.sat.toMilliSatoshi), Some(initialState.channelUpdate))) } - test("recv CMD_ADD_HTLC (over max dust htlc exposure in local commit only with pending local changes)", Tag(ChannelStateTestsTags.AnchorOutputsZeroFeeHtlcTxs)) { f => + test("recv CMD_ADD_HTLC (over max dust htlc exposure in local commit only with pending local changes)", Tag(ChannelStateTestsTags.AnchorOutputsZeroFeeHtlcTxs), Tag(ChannelStateTestsTags.HighMaxAcceptedHtlcs)) { f => import f._ val sender = TestProbe() val initialState = alice.stateData.asInstanceOf[DATA_NORMAL] @@ -469,7 +488,7 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with sender.expectMsg(RES_ADD_FAILED(add, LocalDustHtlcExposureTooHigh(channelId(alice), 25000.sat, 25200.sat.toMilliSatoshi), Some(initialState.channelUpdate))) } - test("recv CMD_ADD_HTLC (over max dust htlc exposure in remote commit only with pending local changes)", Tag(ChannelStateTestsTags.AnchorOutputsZeroFeeHtlcTxs)) { f => + test("recv CMD_ADD_HTLC (over max dust htlc exposure in remote commit only with pending local changes)", Tag(ChannelStateTestsTags.AnchorOutputsZeroFeeHtlcTxs), Tag(ChannelStateTestsTags.HighMaxAcceptedHtlcs)) { f => import f._ val sender = TestProbe() val initialState = bob.stateData.asInstanceOf[DATA_NORMAL] @@ -1250,6 +1269,34 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with alice2blockchain.expectMsgType[WatchTxConfirmed] } + test("recv RevokeAndAck (channel congestion protection)", Tag(ChannelStateTestsTags.AnchorOutputsZeroFeeHtlcTxs), Tag(ChannelStateTestsTags.AliceLowMaxAcceptedHtlcs), Tag(ChannelStateTestsTags.BobLowMaxHtlcValueInFlight)) { f => + import f._ + + val initialState = bob.stateData.asInstanceOf[DATA_NORMAL] + assert(initialState.commitments.localParams.maxAcceptedHtlcs == 30) + assert(initialState.commitments.localParams.maxHtlcValueInFlightMsat == 150_000_000.msat) + // Alice's congestion control parameters are more restrictive than Bob's. + assert(initialState.commitments.remoteParams.maxAcceptedHtlcs == 5) + assert(initialState.commitments.remoteParams.maxHtlcValueInFlightMsat == UInt64(500_000_000)) + + // Bob sends many HTLCs to Alice, while staying below max-accepted-htlcs. + for (_ <- 0 until 5) { + addHtlc(20_000.sat.toMilliSatoshi, bob, alice, bob2alice, alice2bob) + } + crossSign(bob, alice, bob2alice, alice2bob) + + // Alice doesn't relay all the HTLCs. + alice2relayer.expectMsgType[RelayForward] + alice2relayer.expectMsgType[RelayForward] + alice2relayer.expectMsgType[RelayForward] + alice2relayer.expectMsgType[RelayForward] + alice2relayer.expectNoMessage(100 millis) + // And instantly fail one of them. + alice2bob.expectMsgType[UpdateFailHtlc] + alice2bob.expectMsgType[CommitSig] + alice2bob.expectNoMessage(100 millis) + } + test("recv RevokeAndAck (over max dust htlc exposure)") { f => import f._ val aliceCommitments = alice.stateData.asInstanceOf[DATA_NORMAL].commitments @@ -1362,17 +1409,15 @@ class NormalStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike with alice2bob.expectNoMessage(100 millis) } - test("recv RevokeAndAck (over max dust htlc exposure in local commit only with pending local changes)", Tag(ChannelStateTestsTags.AnchorOutputsZeroFeeHtlcTxs), Tag(ChannelStateTestsTags.HighDustLimitDifferenceAliceBob)) { f => + test("recv RevokeAndAck (over max dust htlc exposure in local commit only with pending local changes)", Tag(ChannelStateTestsTags.AnchorOutputsZeroFeeHtlcTxs), Tag(ChannelStateTestsTags.HighDustLimitDifferenceAliceBob), Tag(ChannelStateTestsTags.HighMaxAcceptedHtlcs)) { f => import f._ - val sender = TestProbe() assert(alice.underlyingActor.nodeParams.channelConf.dustLimit == 5000.sat) assert(bob.underlyingActor.nodeParams.channelConf.dustLimit == 1000.sat) testRevokeAndAckDustOverflowSingleCommit(f) } - test("recv RevokeAndAck (over max dust htlc exposure in remote commit only with pending local changes)", Tag(ChannelStateTestsTags.AnchorOutputsZeroFeeHtlcTxs), Tag(ChannelStateTestsTags.HighDustLimitDifferenceBobAlice)) { f => + test("recv RevokeAndAck (over max dust htlc exposure in remote commit only with pending local changes)", Tag(ChannelStateTestsTags.AnchorOutputsZeroFeeHtlcTxs), Tag(ChannelStateTestsTags.HighDustLimitDifferenceBobAlice), Tag(ChannelStateTestsTags.HighMaxAcceptedHtlcs)) { f => import f._ - val sender = TestProbe() assert(alice.underlyingActor.nodeParams.channelConf.dustLimit == 1000.sat) assert(bob.underlyingActor.nodeParams.channelConf.dustLimit == 5000.sat) testRevokeAndAckDustOverflowSingleCommit(f) diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/payment/relay/ChannelRelayerSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/payment/relay/ChannelRelayerSpec.scala index 30d412700b..766d459c5b 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/payment/relay/ChannelRelayerSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/payment/relay/ChannelRelayerSpec.scala @@ -26,7 +26,6 @@ import fr.acinq.bitcoin.scalacompat.Crypto.PublicKey import fr.acinq.bitcoin.scalacompat.{Block, ByteVector32, ByteVector64, Crypto, Satoshi, SatoshiLong} import fr.acinq.eclair.Features.ScidAlias import fr.acinq.eclair.TestConstants.emptyOnionPacket -import fr.acinq.eclair.RealShortChannelId import fr.acinq.eclair.blockchain.fee.FeeratePerKw import fr.acinq.eclair.channel._ import fr.acinq.eclair.payment.IncomingPaymentPacket.ChannelRelayPacket @@ -352,6 +351,7 @@ class ChannelRelayerSpec extends ScalaTestWithActorTestKit(ConfigFactory.load("a TestCase(ExpiryTooBig(channelId1, CltvExpiry(100), CltvExpiry(200), BlockHeight(0)), u.channelUpdate, ExpiryTooFar), TestCase(TooManyAcceptedHtlcs(channelId1, 10), u.channelUpdate, TemporaryChannelFailure(u.channelUpdate)), TestCase(HtlcValueTooHighInFlight(channelId1, UInt64(250_000_000), 300_000_000 msat), u.channelUpdate, TemporaryChannelFailure(u.channelUpdate)), + TestCase(HtlcRejectedByCongestionControl(channelId1, r.add.amountMsat), u.channelUpdate, TemporaryChannelFailure(u.channelUpdate)), TestCase(InsufficientFunds(channelId1, payload.amountToForward, 100 sat, 0 sat, 0 sat), u.channelUpdate, TemporaryChannelFailure(u.channelUpdate)), TestCase(FeerateTooDifferent(channelId1, FeeratePerKw(1000 sat), FeeratePerKw(300 sat)), u.channelUpdate, TemporaryChannelFailure(u.channelUpdate)), TestCase(ChannelUnavailable(channelId1), u_disabled.channelUpdate, ChannelDisabled(u_disabled.channelUpdate.messageFlags, u_disabled.channelUpdate.channelFlags, u_disabled.channelUpdate))