diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/crypto/Sphinx.scala b/eclair-core/src/main/scala/fr/acinq/eclair/crypto/Sphinx.scala index de0a648da3..5199c2663a 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/crypto/Sphinx.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/crypto/Sphinx.scala @@ -20,8 +20,8 @@ import fr.acinq.bitcoin.scalacompat.Crypto.{PrivateKey, PublicKey} import fr.acinq.bitcoin.scalacompat.{ByteVector32, Crypto} import fr.acinq.eclair.wire.protocol._ import grizzled.slf4j.Logging +import scodec.Attempt import scodec.bits.ByteVector -import scodec.{Attempt, Codec} import scala.annotation.tailrec import scala.collection.mutable.ArrayBuffer @@ -343,14 +343,14 @@ object Sphinx extends Logging { private val payloadAndPadLength = 256 private val hopPayloadLength = 9 private val maxNumHop = 27 - private val codec: Codec[FatError] = fatErrorCodec(payloadAndPadLength, hopPayloadLength, maxNumHop) + private val totalLength = 12599 def create(sharedSecret: ByteVector32, failure: FailureMessage): ByteVector = { val failurePayload = FailureMessageCodecs.failureOnionPayload(payloadAndPadLength).encode(failure).require.toByteVector val hopPayload = HopPayload(ErrorSource, 0 millis) val zeroPayloads = Seq.fill(maxNumHop)(ByteVector.fill(hopPayloadLength)(0)) val zeroHmacs = (maxNumHop.to(1, -1)).map(Seq.fill(_)(ByteVector32.Zeroes)) - val plainError = codec.encode(FatError(failurePayload, zeroPayloads, zeroHmacs)).require.bytes + val plainError = fatErrorCodec(totalLength, hopPayloadLength, maxNumHop).encode(FatError(failurePayload, zeroPayloads, zeroHmacs)).require.bytes wrap(plainError, sharedSecret, hopPayload).get } @@ -366,32 +366,32 @@ object Sphinx extends Logging { def wrap(errorPacket: ByteVector, sharedSecret: ByteVector32, hopPayload: HopPayload): Try[ByteVector] = Try { val um = generateKey("um", sharedSecret) - val error = codec.decode(errorPacket.bits).require.value + val error = fatErrorCodec(errorPacket.length.toInt, hopPayloadLength, maxNumHop).decode(errorPacket.bits).require.value val hopPayloads = hopPayloadCodec.encode(hopPayload).require.bytes +: error.hopPayloads.dropRight(1) - val hmacs = computeHmacs(Hmac256(um), error.failurePayload, hopPayloads, error.hmacs, 0) +: error.hmacs.dropRight(1).map(_.drop(1)) - val newError = codec.encode(FatError(error.failurePayload, hopPayloads, hmacs)).require.bytes + val hmacs = computeHmacs(Hmac256(um), error.failurePayload, hopPayloads, error.hmacs.map(_.drop(1)), 0) +: error.hmacs.dropRight(1).map(_.drop(1)) + val newError = fatErrorCodec(errorPacket.length.toInt, hopPayloadLength, maxNumHop).encode(FatError(error.failurePayload, hopPayloads, hmacs)).require.bytes val key = generateKey("ammag", sharedSecret) val stream = generateStream(key, newError.length.toInt) newError xor stream } - private def unwrap(errorPacket: ByteVector, sharedSecret: ByteVector32, minNumHop: Int): Try[(ByteVector, HopPayload)] = Try { + def unwrap(errorPacket: ByteVector, sharedSecret: ByteVector32, minNumHop: Int): Try[(ByteVector, HopPayload)] = Try { val key = generateKey("ammag", sharedSecret) val stream = generateStream(key, errorPacket.length.toInt) - val error = codec.decode((errorPacket xor stream).bits).require.value + val error = fatErrorCodec(errorPacket.length.toInt, hopPayloadLength, maxNumHop).decode((errorPacket xor stream).bits).require.value val um = generateKey("um", sharedSecret) val shiftedHmacs = error.hmacs.tail.map(ByteVector32.Zeroes +: _) :+ Seq(ByteVector32.Zeroes) - val hmacs = computeHmacs(Hmac256(um), error.failurePayload, error.hopPayloads, shiftedHmacs, minNumHop) + val hmacs = computeHmacs(Hmac256(um), error.failurePayload, error.hopPayloads, error.hmacs.tail, minNumHop) require(hmacs == error.hmacs.head.drop(minNumHop), "Invalid HMAC") val shiftedHopPayloads = error.hopPayloads.tail :+ ByteVector.fill(hopPayloadLength)(0) val unwrapedError = FatError(error.failurePayload, shiftedHopPayloads, shiftedHmacs) - (codec.encode(unwrapedError).require.bytes, + (fatErrorCodec(errorPacket.length.toInt, hopPayloadLength, maxNumHop).encode(unwrapedError).require.bytes, hopPayloadCodec.decode(error.hopPayloads.head.bits).require.value) } def decrypt(errorPacket: ByteVector, sharedSecrets: Seq[(ByteVector32, PublicKey)]): Either[InvalidFatErrorPacket, DecryptedFailurePacket] = { var packet = errorPacket - var minNumHop = 1 + var minNumHop = 0 val hopPayloads = ArrayBuffer.empty[(PublicKey, HopPayload)] for ((sharedSecret, nodeId) <- sharedSecrets) { unwrap(packet, sharedSecret, minNumHop) match { @@ -403,7 +403,7 @@ object Sphinx extends Logging { minNumHop += 1 hopPayloads += ((nodeId, hopPayload)) case FatError.ErrorSource => - val failurePayload = codec.decode(unwrapedPacket.bits).require.value.failurePayload + val failurePayload = fatErrorCodec(errorPacket.length.toInt, hopPayloadLength, maxNumHop).decode(unwrapedPacket.bits).require.value.failurePayload FailureMessageCodecs.failureOnionPayload(payloadAndPadLength).decode(failurePayload.bits) match { case Attempt.Successful(failureMessage) => return Right(DecryptedFailurePacket(nodeId, failureMessage.value)) diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/wire/protocol/FatError.scala b/eclair-core/src/main/scala/fr/acinq/eclair/wire/protocol/FatError.scala index a992a61932..217745fbe8 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/wire/protocol/FatError.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/wire/protocol/FatError.scala @@ -52,8 +52,9 @@ object FatError { .xmap(pair => pair._1 +: pair._2, seq => (seq.head, seq.tail)) } - def fatErrorCodec(payloadAndPadLength: Int = 256, hopPayloadLength: Int = 9, maxHop: Int = 27): Codec[FatError] = ( - ("failure_payload" | bytes(payloadAndPadLength + 4)) :: - ("hop_payloads" | listOfN(provide(maxHop), bytes(hopPayloadLength)).xmap[Seq[ByteVector]](_.toSeq, _.toList)) :: - ("hmacs" | hmacsCodec(maxHop))).as[FatError].complete + def fatErrorCodec(totalLength: Int, hopPayloadLength: Int, maxNumHop: Int): Codec[FatError] = { + val metadataLength = maxNumHop * hopPayloadLength + (maxNumHop * (maxNumHop + 1)) / 2 * 32 + (("failure_payload" | bytes(totalLength - metadataLength)) :: + ("hop_payloads" | listOfN(provide(maxNumHop), bytes(hopPayloadLength)).xmap[Seq[ByteVector]](_.toSeq, _.toList)) :: + ("hmacs" | hmacsCodec(maxNumHop))).as[FatError].complete} } diff --git a/eclair-core/src/test/resources/fat_error.json b/eclair-core/src/test/resources/fat_error.json new file mode 100644 index 0000000000..89a187c77d --- /dev/null +++ b/eclair-core/src/test/resources/fat_error.json @@ -0,0 +1,25 @@ +{ + "encodedFailureMessage": "0140400f0000000000000064000c3500fd84d1fd012c80808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808002c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "hops": [ + { + "sharedSecret": "b5756b9b542727dbafc6765a49488b023a725d631af688fc031217e90770c328", + "encryptedMessage": "e88935bf7c9a374ba64fd9da3aa2a05e6cf9e52cfb1f72698fd33b74b9c79346284931ea3571af54de5df341304833b0825fb7e8817fd82a29c0803f0a0679a6a073c33a6fb8250090a3152eba3f11a85184fa87b67f1b0354d6f48e3b342e332a17b7710f342f342a87cf32eccdf0afc2160808d58abb5e5840d2c760c538e63a6f841970f97d2e6fe5b8739dc45e2f7f5f532f227bcc2988ab0f9cc6d3f12909cd5842c37bc8c7608475a5ebbe10626d5ecc1f3388ad5f645167b44a4d166f87863fe34918cea25c18059b4c4d9cb414b59f6bc50c1cea749c80c43e2344f5d23159122ed4ab9722503b212016470d9610b46c35dbeebaf2e342e09770b38392a803bc9d2e7c8d6d384ffcbeb74943fe3f64afb2a543a6683c7db3088441c531eeb4647518cb41992f8954f1269fb969630944928c2d2b45593731b5da0c4e70d0c84ad72f642fc26919927b347808bade4b1c321b08bc363f20745ba2f97f0ced2996a232f55ba28fe7dfa70a9ab0433a085388f25cce8d53de6a2fbd7546377d6ede9027ad173ba1f95767461a3689ef405ab608a21086165c64b02c1782b04a6dba2361a7784603069124e12f2f6dcb1ec7612a4fbf94c0e14631a2bef6190c3d5f35e0c4b32aa85201f449d830fd8f782ec758b0910428e3ec3ca1dba3b6c7d89f69e1ee1b9df3dfbbf6d361e1463886b38d52e8f43b73a3bd48c6f36f5897f514b93364a31d49d1d506340b1315883d425cb36f4ea553430d538fd6f3596d4afc518db2f317dd051abc0d4bfb0a7870c3db70f19fe78d6604bbf088fcb4613f54e67b038277fedcd9680eb97bdffc3be1ab2cbcbafd625b8a7ac34d8c190f98d3064ecd3b95b8895157c6a37f31ef4de094b2cb9dbf8ff1f419ba0ecacb1bb13df0253b826bec2ccca1e745dd3b3e7cc6277ce284d649e7b8285727735ff4ef6cca6c18e2714f4e2a1ac67b25213d3bb49763b3b94e7ebf72507b71fb2fe0329666477ee7cb7ebd6b88ad5add8b217188b1ca0fa13de1ec09cc674346875105be6e0e0d6c8928eb0df23c39a639e04e4aedf535c4e093f08b2c905a14f25c0c0fe47a5a1535ab9eae0d9d67bdd79de13a08d59ee05385c7ea4af1ad3248e61dd22f8990e9e99897d653dd7b1b1433a6d464ea9f74e377f2d8ce99ba7dbc753297644234d25ecb5bd528e2e2082824681299ac30c05354baaa9c3967d86d7c07736f87fc0f63e5036d47235d7ae12178ced3ae36ee5919c093a02579e4fc9edad2c446c656c790704bfc8e2c491a42500aa1d75c8d4921ce29b753f883e17c79b09ea324f1f32ddf1f3284cd70e847b09d90f6718c42e5c94484cc9cbb0df659d255630a3f5a27e7d5dd14fa6b974d1719aa98f01a20fb4b7b1c77b42d57fab3c724339d459ee4a1c6b5d3bd4e08624c786a257872acc9ad3ff62222f2265a658d9e2a007229a5293b66ec91c84c4b4407c228434bad8a815ca9b256c776bd2c9f92e2cf87a89ed786194104eba6b7973491f04d0b924c10e6fcff336d037b6e53fe763919da946a640960978994e8d0e5a2d555c9a897ce38a324c766fd01e9416acd91f18b4e7756c913d2e754de226592f367f2309f4e43378adef150392ee38af70f888c7bd802f2523bed7ef9fa12dcf5b9214c974c51563d5fe81c4f7e352c7235811b5fc117cb2bcbbe70cc67356e2b3a97adc7a8fe8f4755a2f93bef3926f57bbcff17956c4031a2ae8c88d57dd9235b49a0253e86a7f173d96907aa2e162c82f1626dd5c07188e5e01d79724a546bed25d9b83dbce197a63f4c13deb374314e6b4ad25f824a30252acc6f33e5cb772bcf0a23130056f83de2dc4e9edb1e743f525c1a16b3beb7d1b57b2f822e097386b2f6554c065fdf1ecd9697d569f1c3a351d137420e8918b985a22de62dd46f9e2ebc86145498960cfc845a528770ae6649002894a1e6be7ccacadc7be41d8f28a2c0527f2c33310336707610ee04711c72257615551b836d4183e7805f0057c1f60e74a1e5a545458aa29a24b0bcb6f1ac812d680286b717569a5e28b1db41745ae8b8a32a31b6e4a42d0e353ddef4a1976500dd4bae3eef7d4c4c135ddec570ba4e24f0a59332377fecdcff0e4431bb4b6ffc13c3043261bfd421cfc705ae168d00f5284ea18032bb27f26c4ad0731ac835eafdf33b44e9d0792766f9184d830d989f1e949861fb75524df6486e6d91c11fadd190840045ecd238004a49e75cb0f344613f7d3dcb56769d07aee7e57029a158d0eb65da164689283d11d900a1da273431f5e5ac3ef7e5d8f1a8e48646ff7b2457baf275809c4410f7d790da667e1b7bc36b8ef45061ce722d85553382ba0afb4281b3f32993ca307a6fc4ec5fb62d3b705b388184fe05c073df159bb8d5ee031d7ada6667259f5e523b12552fc077e855b904ea00ead8dc1bdd8b3aba45a90371c3c8a9fc238d4b478a7c8d3df1cc6128e3967aab65920e6297701bb5dcbde8c3b08bef891a31ff515e6fe58b245812d43a0abd38d7f66efdc0e683a8976e0c58629cb996d8a025c1c7af586a5ca88052aba6a78426c1c12a6242bf72b6a0b1df7d7808abdb5c614adf7232ff69c9fc71527f5f28d2361fb98b31540fd8162a0a4ff22d57f07aff06def8dd33186eb510880a86e793a184be0dc4f304027b10497fc7cb8587e75cfe510d06f27572d052c596f1939b1a715e3bf89e1af646eccf5bf778753f74c5e7ae3694765379923bba3759ed44d2fbf539f93845e4ad65ec1c702bd56985fd87369c6d36bb048e0b6d61146d604acd449990c50d823575d432ce8c112f5f04d28d2f17e4c0d0e5c8b22ad4770a9d08bfaa7b1d7296d89840d2eefaf13ba0a2a49a2d93950cea4f588be63e9195f06daa654d600ebcab7f44ad4417d485252c3ba215ad500d57c49babef7d14f0d92a1841d6a3a342779064a168049cbe5769c828d44687a9b2f8e12e2869e61fff7091c0747ddf26977816f4df99a9ccf415cbb4476258ab1a9af126d6bcd2e34f3f21fe3d429978efac0ae5663fce2cf2516891073ad2787d60c6fd2fcfd33b95e7f4b3c2df0d722b9f7453d54b3b0481d75ce0ca02128a9ba02428b89bc7ad030bc0f93eba6a9154bf620af1352d9b21099688a950e3ec28b8cb6658cc84a26721b60646792bdd43b05b14c408c4447d573066fc5952d3bcda01a7d6856374ed14118204b87384a265c0c2992be89b704fc1b9a593b6ec7b774cdb0f550dfde429605f31a562f7d91c4eb7525c9f8acc64844bfd1e83a61b38631848584e69f2aa7da9f6c666f19321016ad9325a70178b2135fdb81574b7e13d101acbe60b58a886352585f2451578058f7b0ead8402d0b580b0c0b193a8c7573038b668b512757ee5c690cebda7be15b990ebdaf9b71180a7f140bfae18f69568b7abe76714546aaa58348500c5490f7fc37eafae9a9d2007429637d4e2b768115dc7d22174838869be9c689c705b6f9efb58433010a1d13bac7f0079a0395490fe8fb53857118e90c7e809791c91863254ad2ac1cad183b928051b2d693db651a80812b135dd232da162082cbbf958c7fda06a751846ec180364ebd5d2c3e1175fe490506e6707de6e2b19c19698d7660b0cfe4c556edf0ce9d468e7df6e2267632d26e50af9b68546e4c88c3ada0539beb41753dd5d2f3ad8808239d330a0b330dda8790c8e4ee99e50c6350b203b77faae51b6cdb422509db32596cce4ca4ce1d0664239aebab7fb5cb9a2f7026578d2a0ed1f4796890e749ad568e30bb5418e60045d311d492bf86a23c9cdade0035b4ad9d94bae2b2527ebd191ce354df349c14fdb59a011e543fddc181d6ef5e125c58c50a1461e85f49f89af2e4e7f9cafd14c379704bb6b73c56b004ab9b395597681d6a3d6d65ea14beb86312ef6c9f2b6b7265a5dd3e8a8aae7ab28181e031484f35a153b6f7caf520c1a865457a87178c45ca2e6c0ed8a1eaf489d038b84ee36a464c6c6124b947bb2a92c1c3241216f98021ecbdbb0cc5f5da767272b910ef662707b6c87a38439c5185c27eafe5a873d2b972392e0361ec696fc313b807aaae4921ef5d9d87cd1ba5514a415ccfc1597ff94fc62d67b003951ce11151338a56d349f1a937192799dd0e0050ee9d4f3a6a8b13572e40a6bd6e6deda67e7f9caafe3e1a80cd446d1e46eccdc355ef797fa099e011d0bf005458cf10537abdff11792755934d8393ac67fea23f612c388f2a52b6c463e0bd1575a719adca6c79825c6b5a5128f0bc6f88c945c085499c03090897fd4eeaee39c9f0b5ecc11f8ed18f4f8fa306ba49953ade1c43aad33eda08b2c0a6b0afb572a320b6a870563216a569128fcc3c6f03eb68df70be50b869ee1f6ae7f4130e98af08609133f33a217fee3877ed2ae1e40f31b649070cdf019b99b7ccca5ab518f2a2ff9f389f0f8bc8ceb71d3028f11e28cd4624eff4d01797369cfc89ab9b1d02c033e09a20edd404e2d3838fcf9385fa750779d1da3624048ec7d71830c84b1d2cc49bd2a6c87c1c4533cd217222798d7711a688954a439cf27bc7bd1c8ea2abb8e32dfa2dfbc601d55e0e46d8142a5e69e3e71add6c569cacfe4db40f219416aa7d3da3f1c3c045da54acbd58bf505e17ae9c535e03af2f2acd8e290a7f5a6615353cbcf92da140844711c5f2d56c4ae6505c4761c5d6dcd8489acf8404118150ea6ca9c5f6d3d46faaeab4dbb97572ad1f908713a0d93999d4c9040e221af562945906b68ee8387320baa0451bd564396562cdf14050e51be5a176b36b11219844141fed9962c7350ebe9980050c81448015460960ec0c23fff33567cc057904eebaa5be1e36bfb05ad3ef78f722021783869d4ed1a98d6f95167b9d650ba88db4dfb41ebcaee6d362a62e24dfc4694cf7250dad6ecbd1d102619303c63bfd06769ac975f57a45f2eded4dc57d5093ae4a82c8619bd8f21f7e38cb7f7d70dfb54aa36e6a1afcbbe6ab864d5497af305415ac2dc04aa49071295c381377b568b955366084e9c619cef2b02ed8d9837e454fb2cecc6773b0d077963856ddc057c4d0abe0e08eeac42eeb9b64913c73585e4979fd4745112a17b34046991a4e61d0d59964e298146ef79caf0bf0254fa38bbff147e4225b2c279a483e0f36ce0e6190ea65d65c8106554666709664ef5688a851ab3719d01a7de113c2f945629fb6d658f46fca949848d9f66b6324ea4577fe3d4be10f23dcd226108aa63553c10d448f8510ee16bd3e2d6fd121558788feb09afc82b055ee9858e496766ad58deee99078badd3083309b5cc8a29d0b93204d800c52b2fd226b735e5bde669824b0b6cfaa5ea03b34fe0b96c47cb399de1d6b92625cec5418772cea4500e7a16a17a53d36bf669eb1370dd7557cf8fed3bca71ea16d72bfc6206061226f0eecffecef9f5dcfd8465c05d3600c76a70c0b8913e70e7f5977cd7f1269178bb7548a25d54387eabc1af7ed465548ca5dc70d609412d19c834e4700a652b21876c98948b16e0981a35fd39893799dc5a22eea85756591d588ac464d2928bb45837c50f660f6abc0c8c76176221da95214dec82d0432bd04609e25f622a91a44eb562f4612f14dfb14c23dbded031c073306c3b03212c094f6d24cb52399952cf5f44afdde70e98fa98c25ef9eb1cad57d44fcf186fb3fad437f5dd5ce5c06de8e51c98ec48c66008ab451cd60388bc50f01aae895702ee47b85e84e8bd5da9da6c4588ac251defa73e9a2a326477a9c6be498532bbbfbeec15a6710c893c7d3f6c9402c4545389f9903a82e0163e48c8b566d3a25b7aa0ef4e2c50df8a8e4a3e92ec7830afe5b7099a30852fb3f1233ce228b75e137b7d7b89361ca5e9a1d5907e817dd2421aab4edb7cb31149141341b93a5a401977875e7a4dd473c5e75d31c8a852528fd92c9b99d39d6efbad9d0a21a44bfc42126a402bf8fc94de55c777ffa2463426ccd59ea3414440046d0f5de396bf5385de3a0d5a52ce63aa2e0d1168dde36bdee89f6a2f38614a884694b014f6bbb5a92b4339b37cb3c5f6d9aa80937e27e3ba5c2f1256445107cfe53d529aa8d71fb84f6a83a3b825ccef955e1e1c49e5312fc6e8ec3c17bdc09e05234bbfb54daa253ebc27b14f35dac3b9802d0f2cc0694a137e44bffbf770141a0baf9118e59c75c75c50bd4fb6dc74bc32e20b7479a8fdcfd7c440ef7a85086d77a0de3ec5ec1e88d1c04ad9283f218e04aec74fd3f6cc269054794dc2d9fae74e49c67d20b3b047e417fbcd6e8d657ab4e28b7c1cd3354748048e598230992c11e6be9012c484d373541863db31c189d19c31c53080d76f07c2444873c9b3d539a053843e8db3bc2dc8c75d312226bd5119331cbdfb55382634d79de4e4b431f82d0e4e0982c6984b3bef9eb0d5db53c395d7dad990a416dce9ca1442b7b3796ab3ad88b12ac05ab8caa098724dd954419957dc28d4bd96d0303b5b2104bdce0e615a57de7bbd48322e69eae01c46ef4551728f228db0e29397269422efa44ce21fb3f8bc4494454a8a4e81cafa9c01fed0c9da5830526346e8586da45729f0f3756f2a2b78af73c177c1325b0a6aea57edc5f30c646c21935975eb8ab0f1c1dd27d43153000e3195acace6e2186262746640810d6321d8ea75d40464a42a97625cbc5bf8684ad856e5ffd1099013e90959db87984dc94ad08ab0677e052d59acdbc3de31ab16ea176a60adfc27347116ba8d6c020c097a5d733cab6c034356147e845680bcf7de13ead9e319bf6be8790758281d97c084a6029ebed597bcbc83d59251d3b99e712596e751ec682b02f17f142ffb711070feeaae1a1b7e6f1ba01ae1e51cd4a0c0018601179553e362768a9e6ec5228082611bc47a9d669c293ca495930b1eb9c9f55e63eefaa2ca69d85be9801eedee83c704092de2cc59d56fbc8a4c13d07351703dff858b881bbcbf529a2cc6012450853ac28c73593d65d0dec43cfac2e6f1ea1322529e790c2b0e1d275859b52420583c4d7808728b05cee0a615e9820e4250db84d9751d846006a34c654151b0b8e43e141eaa3d892d1f9437a10f350b497a2e62ddcc83db01a79f40343e9a8d66ab670f11862262da4f482e9e3c23c2182b82887b72bd02fd08d21526e1f4e71488179027bda3fbeeda0b2c80969ecfe2ea3c20748b251b9af757b3d1b690524c2c4c9e2890f4c7a174b3ea1748b0a6c2b8dec98fbb222162fc1b6fad1d18c8f8778f809cea0772549814f8ce91ced32c0366acf05c2f55fce9671dca3396540148d30354b6bf3a0dc683d3989cab1ecee499ab27137c180d8a5a886f18454f324326259720e729a53247ff6b746342a4fdae9c78fc5da03ed0407f73d61ca1a465ce367508532872552c68e754a0b2b753eaeb19c170fa179b20083a7a0ce07478324b58148d3a028a58ae8b163264b0affee840db55cd4da9bb1170db1792120a967fc8ffb7b84afd3e9590bf5efd525987e5100e43ad66b0f877c6debf2ca9f2c1de43a5d62b9c5bcf68c5712bd78793f2759afd2d9818551ac0832cc3ee58a925a051a1f2474e6e6f3ce03e0623b7bd885d3e069dc2521348ff9222588ed26b255eaf5b71cd32d41943de424745382ba0613400a4760bfedcedd3e037815c91d5501ff20bd32f11fa92f718de55f4637d7f486e65015453abdf66e4043af56e9682a65a4cdaaa0073e7a3a356762e3f3503e0c835d3a9660d6d828fab75aa6b99cdb6658606489e12ca6f88da681675e244353040888e1f956585e1778b6792c60cb0ca7cb76fe54b7a328febe5704641553d5ea4bbfe5d3c8b687d332289d2463024fa50822ee5f6961dce006a44f2617938848c291a9bc49bdb44427dea0b038d38f68334d5472abf1ddde77b8e5b7db843741f12d3e6e9475d2acb0bc5430e9a6c91706659f9f9017838b1bb40e6c584c0fa055259cecc643695ad579703b01e3d54c329db31ad1486b888e8bf250e741ea20e1bfe385416dc2eee2fd9c3eef914c4421d1d9de4dd042da04c0e6ff8bf46823b2d131267138b63b66e5c6d86c6d2abdd59b47d4c2da2b1ac840971413f761b148cf8f0b8925d74def433b4ddedc91e78164e01d72259d4298991c27499216729854cbe6e692b72c4c726b6a31b234770aa90806f81b6436656093c525f867821b96f944d91320aa38942959f90dabde0fd5fc92f181d9ca70761b4b8d2d5de36dbd5dd44aaada53fb37663d601cc792a342defe9166cf42adfff0ebc0218373176c56b059c792661a842f8c92abf2fdf91766d95d6782fa6d855ac568a7023ecd6805d0b30f86aa757be0480c338faba1ecdc425fc1dc7b1942a41cd2d8e3ba971c5911f185c4395f020667a7e390f66932c69411dde0c2fae676ded1c384182e6cdf5f1cd8c8ef8e805540a2741be25bdc240cfb8edaf2c8944a44ccca542d632c616e528b929eea8932ccfcb44a758a6e04230d15e4ab321916f65462e5e536898a14afab59d7490ba913d29bac587e66196cb70ab9f2aa687e06c3c2b23066f17dd65eddd5f1be4428a6d9d56fa0d9d21b45f7d7ad8a7b12c9693e68045979105732e3f5a946d662ffe59ddb2aa8b65aef07319e1aef7e62dd3e94860efb1cda6ce064c0470727229bfada1b6c5368203f7511393a3f189c201790591494e8a5d4421f3df32dca345e13b60a8a8ef53c04a8108ccec3c04c0bb688d877f5b91467b628f4e1ccaa63348439a5013bc937ff0186e7db4a0da26b6974f76264fe408fa56763c8e31a45b934c13c371dd82d25a441d79649cc553591ba2dae194e356668a6affdd71f0b87909ca5a490f73183e886f4eb094c01c6d36bbbbe897c3248591de3a6e80e1e3ca6e97fd6adc179279584025120e6ff4c8d276d242735ff43daf7904f2c35acc05742a3fd56a5584b0d55d734505860e1b4d3e7d1504aec47ab142f3b376cbd2cba4c1ea427e026982896e86909f12a1701b745b7305494130b25cef2c99143dce81ba37d6efa401c4fac69164241290c4fdf5887f0eced3b0656201c138d351c6c23c9dd3788a583ba98e520b8090402e3e308f626d7d270c897aa98a53052a1657528ef2d370fabc5fadcb6e4b118c42891ba9bc5c09af81b4b70c953149f30d65144e520284f0c698be112b1ed628e0647e5b1c2662ff94828fae3eecfe0217bf9a4d203ef2105a43b7d2b10480d735d8c27d449d2164924debe6c7f24f09ceb304d5883bf9c310a06d31e8fa8446fec3b9325ef8669e6134c00be761a0e52ecb7f3e4977e6e874ecbd4699bd246c60b33bc30d6bf214e505e7070b1aef5035031dc329c9bbd711e376a1addd5f4b6278fa297182c2e0499e34e43b874670266a70f951045b2ed3dff4e725b9e063c19a7e68ac027aab525ea9ebfcc39fa0bf7520a25528d3a8714d73eb6b0ca36e023f466d4ab01f219e734dfaa188d3733c41b26babcd51c4fdb5257e137f98a5d588817d55a24033a38cda4beff7f4fecf1e7b89bcb4980f93edc166b565fd054ddc54fc83088dbdb47885b8929aaec6b4638bfe671a7cab9d6109f860946bff1aa3918802656db7369e75df038e6d60af2f29788e8020614d71317fab1e265da9902e9aff65be017a8abe42a43df0ba690c0c4178e2ce73abf58c667107ea316706f9f68a76994f9318b5e2187ae6775977cee4a2e51b613d1a5939e07123e5c9055ad5c83f7daef6ef435fd307d54f68d0f12dfab1787d81233ac02a6a808b5ddb306f323cb31148942f14a0a8dec2d99fb0fe96a3fa7c8fd64b6902dbc7b03060952036e098fdd2a71a29d6d76f5745e39f095bdecc524cbfca696e56b9a07162f490ac6bb029c4e6fcd78cc67e2555d746c5dfb9ce6e53ddb721c375f93ec1fecef76717dcf59832ab7c377270e19ea6c3ab64f7028be9ef195921079b09fab77c7664a75372714fae50095cee4e0f92f0bdd41d008fc0b8a7dba2cfcc2cac845ca354d1a71bbc1fb3ed0aabb4c31c14d9c84be47ab08b3c0fc53835ce01a91d41aa40c1cacca78c9ae2ddf669bea1eb97161e01b98e4f1a073cb78080052cebc627ac0067aa538c9bd6c4d284863e36d25fc3b2e9ba28bae6b63bd186a4999de48a0ca2da1517cdeba18e2048bb5baa36205cc096e3e9e441765e126f7b4e3ae03cd623fdab5f3743c2b5d311187aaac536178b23711450e7c4df83ad105c3f2ab0d4ddf104cce2210a6e41fb8ac3b29f8a67fb695320fbf9bd5e0ce79f5ff8f867a16bb212af4ec6f1cd3a7ccb058eb302e79c560cfafa324385e545f85b51f00eea802545ffb5c63332068faaecfc23e478340bb096c3173dab48d93988840e7df0f4b98987a51f4e1a07f94063b06a1e8c6bc3845a78b924ae5979dc314708fb3de3852569dfc0ed8a92d2798b60f085fabc64ecfc8bff9f02cd1df102bd4a2fcf89b711eb19a4b7934668bb7489b47b122ba755bf8e5ee28294e604152dab50b1958e9f464e66976447b4ac8f10cbc686e39df4b8499539f156a264dc5c93a5cce9202e1faa3879ad4f34a66533c220f624b5786a23ab62f7dad8d82554e94482d28d87b9601e97ce2270fdc5b3f385cbaee5f878ada5e4842ba4402ac279eac575cc4cbd84c12ae19831e31b1d998003a8451a15693c406c19a00bbf16e1fdb96d957f08390e0b50098eb71dbec1b08337dc5a502e103031c197c404fe726eafd72b8aeda2f3a19b8e7d2ff4be16f3f07aac2e8a26a90900be1142a87818b119a6b58a37630eb486147434ef44c9ec5d31b3ae67e26f6cfc273ceb46e40cf773aae28cd5a85ae7a6e2d5df008c34b19ab19448002300619f43985e27dfe6bd4509dd86af3322b6ed811c466c7023777bf84af70e5ce8fbbd404106f44726a2858c96783b510a3e1b2655f97eb5f9fa0594de9fd7d4e4aa4ccf7ca8251e29884f7cd3b8e530324c3a09d366e844d3e927b1e3a60231f8a7bf67e630cc7043ab7e7cc9585c96c41099d7bdc9f57abe6966bd94aff39db2d726c05cbaf2e36f0353e5b79ae89aea33b578e84ca3f283ef8a6928765d9da5b9d21d33178e2b17d1acb9ab75eeb9ecdc4349e15a3a8311ef804c2948ef702c17438bea81430feceeb8393b149caed9fd4bb207161f5d72fabb4465dc995eb552521f08c07e0b3df7533715310cf3e4ab0fab9e273d6d9106589601a1c9bceea8c8f8a652ce7cb7f1f06deb5239b44e44f84a8f909084bab391abc315b01acbf8e2f444f75bbdb9a96767b943aa376dca5e16674829fd04faf7cb659cc70fe7f4824ae9bc8b334141dfedc4cb4b8a290b5f539030df501075656f457d69a6400dfb47cebc48fd9b8624abfb163e556ae506bac544ebb825a7f67ec9fc7ba4318beadfd6699635d90d25045cdf4fdd4dd1356adf6b7d0a4e6ff20cc4e955d4bad18675db23015e241095b9497b0c145db1d32edd3f12255e32c4494231b154f2dc2036809abfffbb09f017486c0f914aa42f225f5bc21be9f9c2d4606632fbb546c5f441e507a673bb320fecfe49142136cad047aef36e4b1dd43446e5255869f1133420141ba5478adc9cde03efb84678f8958f8deb8fbf64778d29e69000a1d8d3a3a3a40baa17537c3ec0649a56d68fa848cf533deff807cd7767d5ef358042543962f9c7dc41c8d82643addb6d217870f67d0267f9e3febfafef8515cdd6d89dd795d16e899e938accd4e1f23f5b7c95ac23a547f7cbf431aa9f039a8195ef8147d27aa52c4b3a2fdc447fe9ca813c97373b2c9faeeb6b9d1dbbdc7f343b0cfa5a73e507cbd2001ce77617a669fb9a430d0eb13d078a9324802f27b07e74380aad059a3e6eaf16d58a188c9fc449790b3f954f947a2399804c288886e41703769d861a9f3459210ae0d45e9e03b4feaa0a4b1f27ce3f669b343cc786e64772abfa5743a47b7e1e4f679e53e300947c112be1814ac02d0cb4d1020716554614f5e31f66c50cfa8d9ff851be0bc4fb5e631e30dcb928885c9929fbeb5b9929b53d46d6b24498c72fb2827c4e1e5076f1fd6dcc9c50b025de8201f6c25a61743980719b19a7d79f65cf8c65673230b1d72605b698260956377c5704e64db000e887dc016d0e08b5bc76197cc5cb52b1532fa17044d315969d668519aedf583c72e90abea5c46194e988a8107ae7891910c56ab1a095a2ffd5402a924c21196ef1f54f880abd6fbc8f84152b42a3279c938ec9c026053b4a06dd1d5258a2e3a782d1f80b094cbe3cd66851882c7efd92d7f5fcd1f92522fbd51cb7e1bf9f810c9989351ddabc33ebf472248ad0606841e7cbd3f9b3eeca7d3e341a7f70676af5af97f66c4808493a11854ab46feaf38a329b490428a2daf2c0ec0392ec063a3674ce0ec8205af29d967b1627cf98c22421e657e8f04b88adf88cb3200a5f4326e1a85fa19cc2bd91d0743fb717434bfd5a3fc6b867feab13a6cff47889d95fb9545bfe5b16331bf88e3e82cc302f735586d165a00e81276e430b7040562a21b241c018553391f6d2b73586fe931104aae7dcdc75f8f0f00e033996f24279831fcd4d04485b25929d6e4183488a3783c242c5d5d5d6d1ce02b53e82de77c5ebae14bb3fbc8c0598fd6a6067b2a4ab235638dd7231f03628352b411b5b2a55c7a27d11b9a5c2161dae3620a73909c22ce94602dc81d4d26ed1662d99a0fb00b311f5a2275e94928abd8ecf1734958041a151d75acb236c4e89cba9b9831b1a376cfd284f4ccf964e7778cce1b611e9045272655d4e825b1c5ae7f63eb9c14214441d323ced9a5847fddb2ebf8c08af8d66ed7d1764c6157b0eb186481162f8321782709c9122a686e56e37ccdd7ce91ed1b5fac1bc01128a6f9fb52680a5629c12ce477fc3041344e002d5cba90d11d662d6e57c22f356eb4d0429c48a924c60bdbd19d904d2847e24393e95edda5a149c8a33d2a1341a5c18249b41bac58fc2fbbc153bf7e42e8a40de51d4bf227d8038f5153a1d49d58ae39292a0f8f35635d4938aff64326d77957a533c772d67141ea3a6640a6bdeae04fb053cf7cf4c547cfb3380fd1a07b4ce273bfa52f8e962d10908d1ff3a431dc0babd12f48c9ff8be976d838ac0e1d5644c3b372fe86fe271a6366df38bca122bd0e3fa48b7c61b22d0da68d8d1f97fa427a722fde459b50b3896feaa70989be8726de532e8b9f634ceda1b327eb4dd4d26a28f220274f96a7b2a3edfc425106d90320da2b050f34621c47a227b302604f3d81ac7c7d15c6f6707e8f9dba13762c2f301872104d1e87839336edb1d79a042009afbca81f72105b57d80eb245380b552aa9f36d302896a815f2b5dfb5e3280e5661c01864e3eaa10b6c730ebf8ea28756d14ba4fab7ca3d9446dc010bcc74425356a879d4bb5699565b0739062d0c441056793b78959ac428c22d0b88e2fb074875abe834bab42d5d300b688b13cd548278420b11f1a0484bb1ee8937fb6451c0e90bd589f27f02f4cc5eba83236a1abcef30273af34cea2c3524f89248f41df3d0cfaab54e430e805f5639a4393db4875b5ab9671cc98ed48e8a3957bbdfa3ef1f8f6584756c351305d09f72140c6d2ac8400efb33162e86763a37f8d4e66795443792c4f6273b87744184d607fad2cdfb5f3d5897c12821a91927be1afe2c60a1325c917669fa0f77752c8325ec7d102774107ce14e7567c3a667ab4e1609b2783b3eb46c07890b990476087d32cb91636a7dc002432ee9ebd991d92ef60c2a2059774cfb13392445eaa4c9eb0f5284816e0b80f4969dab8f881092b9ea3ba151cf66ab34359a376b63614f84ea9c81c2cfd1cb4812b46018ab4106aa4c4f588530e5382b9a5ab4ace11f2f4d69b5c488577278264c358e6ea08bdb2eb17b428af99b209e40181b91699c442b7f2944457c90cbb0456a2cfebaf36ce31096907a02b5a2dd2a76d93adf23fdb7eee3333357aa02c7b98492cb81b44c28357280fa1d0c1a4c9f73998c96e3c63df7708304773abfc7c0acd91988a97a4c8b61d0b031d44c433407796a90ebb10795d706a53a8d0330c34e7423c2e094a9ab2ddad7cefda0c77974888a8aaa1bb9050f1d64ccabf5ec3e892b8b1243f9ca94e401020854d277283f06bd1b94df436a63c0929fe0a33e08dba6c24955d544d2756a5cb87799779e3e0aa68e022dcf56b8295dc4e60e1b6a093eea40e7690ff2dd1fe3049cbfaa8d4a99f5a42ec71bcd3165c79798dc4d4ec1a7b16cf63504533b2004a13cd7f4fe89009064dc34dc46712ed46204ba01489e5c36010b940b3f2e38782ac5e211107b12fe6f1495e41e77b53f858c8ee98b5073a9ca1576a9e2179678c1ee6e7040bd17247281c99fe6ff2506496f53c2bbd2aad8af4e50db4cdc38cc51a0a84f6156aadf1e4a85c180d8e0bc80be3195264c62f19f0433cb1998911cfedf3517140db47d4caf1d7e10a39af8d6f51eb799f834659caaec9b0e7135221f17ce1c1e7e49b07cf63304c5502642a533cdf6ba6596eed50e93ec016f9ebe93a6b62291e3d640fb3e9e33cb88697fb6fcd28489c9a6c3a35a986be0dbddff898a856d9ba7ee252ea0694ad9e7e40fa4edb3a9f5599a4b19a8509eae21263079c674957f3913458ca43f1ac5e3b7e5d58ae1c3db8a15d2e8e59362dab3fd404747edad74dfd13efc329df0063ab64c48732dfa70918026dd9e0f0cf897ea2b499b3b3c45feb194b65248c83062eb03bc18c1ee07595c21f90dc83fe189a48c41e54e9622ed44ed77b2400c3781f24869e633abb0b12c09fd28015f59b4d169dbc76a841a3f0443fc7117bf3b54e2c2269e2b5126bb0d1eaef458ae3d7db9e271ea99811559d73e518e2e9e7dfabf7218c5b6b4dd14d88fb4a3014b43711d6a98dc0387f351d0961e453d473ca7953f9a985e3d5664326fd922baac1bd1132f05165949610db0b89cfd4544b1ccecf0e2d91c78489b938418035b67b4bdd55e6592f4df0604df867b62504a6273981e25232287c2253a8ed9767453c01ab6d3cef8ca8c68f93caa73ad6a89ea5a62f564b602d8529d238768f360921c1f8ffeabfd91ca3cfabee30771e006c1176e01018c4170b4077449d80ee29b72b5d73ec1b05b81c6a8ba02244f7c739ec5bd84e5a1f2f815327313d7a5644cf0b44a8b79949363711e8f947ee7a56b40ad59ed0ce5d729630384c839c9556e09125b1b19f7d6ccee119088a85f5a2e7662347ec07a6431d81592945faa50368105ea0a8b9a6bcc60bbc80b0cdb074e1217a2915c00a20145d0a802ae6b35d5c74df929c50da9088e4eb76a46956b53887ae8bca08f05163be72d56faa22aa4b26c271092059f5795386e34946aff407be89021c9680f8ea123d2bc11be72b59b7db17f5f1ec9b58fb6e2cf7f9920ff0385eeb1d55b1cde0c9866f841c5aa2f2ca5b254eeff44530ee2a3240f1c56a280daf76fc9cb0f68210d0c112441755d6b7ffda9703cca374ce8c82cfb271811a81f5dbdda09b64547aa874a8a39bc65b9a3255bd25636ecc0125271e6db92f89cac59256bb0f3d18f3dd381b18efe6ee1d0b3ca2e5fa4ee903b429f6b1241dba75401ae50c02ec267c72e0cfa23c568ea54855a91a7461ac514f27c43a6b7da023224092cab19901e87eabe340f64582852ee7e89df92be4ba1a56467f26b71e0976e6d413c390bf3b3a7bfca782168d5d8c9789bb9e92c0fc8e0282702e3f528e65d9fbd98145ce64c98f771e9f3ed23f932246e9d1dfb0032685eb10202d17ba437d030b8ac651b75bc935abd2274bb34225a299c0d8f4eee3345dc8db51a148b6b277659f5afa6a4088d6da4120a2520385c67e2e9f7879a2e60191b89494d7eb522351d710f97fc078e93e0b7fbb40683e79d53f37792b8aba2d289ba38612a789ca7f430129757f0d1029ec18e52add01d3a3525604c58f8f0770f2b56a1b42d8d89ea8cf490f132f6381f359d24d69167c74e3280bae88dbee8bdc1c0b6d96d36607bcc38f328100d95e4783bf24a1be4b25c21af2b8fc8218e45a080cc2742721f3f3f6ca8f34f7f2df87d1fc6be8c8f5738b35af8e70f22fb6c35a7a424c197b2aee9318db19c18d86d30ad5f3810a41c1d10af431dcbb8500aebae9da4f374028290bf6cc3b58e9924ff7f50cdef6b2a49fc766be5c099df11ae2bc197ee184a4b7b041b543cce6eadef26e7313682644b9a6bcfd34598ef73b7f5de3744b0c9c67432ca6d03094a3ff865431bb726b47e70742b42eadf7d5e8dc642f347577a4a44574309072ab80647911701b6724bc77392ade5c4ca49902e987dacb4630021cce5f62d261607e26f8d47729222d3d3cc1041906c341730253aa75ebcfb3073a1d2156b143f7347babb8d828f8e7517ead6df279207590418b5c8a5018c56603a39fc28a8edd66865722854e35e21aa3be6604ad95ff2e016493abdf1260d3e525bfff7035267ff90cc2afd67f42bd3ff1cd919e06948e9aa78fbe9ed0d85e0b368d202fc19e9952aa4c7e989d4f5296b936d278b88b50d2905b4f9090e520bc57e736ce7006c5494a1522b3894362d4dfe83a5a070a332a7369e6073f1f5c26f1afdcfe1baed70044caee0e5e24cc3d56ca99e1601deebd63f69b154f74a4927ab7085cad260b16e6251d9cb1f6bdfeed60b4f9309e2e4f5029d8ceca026d4e1d3152c83090bba6b84b47cbed204baa78fa900b2dc34de574b4fa46b51871d51f02a22a0da4d6a3bf12be3f18ce40816595943e04f33a9df3d338225c20bc08f07c4092d43fc8cd8ad610215119f0a78c017dc7113b8860d5139bde3b86ae942e54f16c7561915c08eaf6a34af36b48994ddb6a5c9de4459d6542a53936d377acc7af178b9d360436c006e09051be05cbfd1024639c822daff8cb80d03d1c2d76927cb69cbdb48b58bb8c1426f2d4bd1fa92e32ecc104045455fafc6f05d000ba9420b41a806d77aa5d2e4378292279e9f07f6dc6684fdc3759df2e4edb5f93c6f2085ef3987b60283f54254be9516b0d1ee52e5d839c00a4493554432c24ffe0ae91ad2772314912f1ec5611c4e8e245d7628903b62a06f8d1f0ace601be6bb7511690aa9c5a83402d5d93f6cc04a75f2abe9ed312b4101143c9dae34b51e998322b5be86e7a7e8088bcc85ef9561d640fd2fd4de318fae0e9759bf29836fc0c23b09b1e5e8331e0f89ad7c4e49c26cbd964be519cbe086ccf35b6e5804cc833336f8825e572cc6172c59861b15e722d90ff3b1c447bb31cfa77fa89f9a76be632e44a90c1da084817182df62b195d3550bec029212078b1adef1e0fffc94a50cc2a104f3e0e5e12fc72e6a294ee0289b5d0f1cda17e8970310e0793876bdbf0cb6e964f9053ca42be0504a814bc6c43f33f3d256330f0ab4eb1c2158cc6eaee2c8b238f46f1a0cf96bc1f7a563baf4e4139c75bc5fa8fa3fb1f656a7aa53756580109c52ff214f877eb883b6e4d031eaf3eb21c36a7c707db60e2f2f8852a9a6f0ad9f3509b923daff9614b8ae2ae238caa66000a79ef637211e5a3343736eef0baeef2ace798e586df6e2de13f20c93b249cbf8e8745cc88abad72c24c0b4c075847ff820d7006adc966cb6bf3332f12bc13b031b91e434aee954e3f83ef678a274acd416d86e1f2592dc8e6cc8763d1d83f4e2df62b18b76e2a39e8984be9c6833295783c295b685c6a229fc9c683cf3d3736a0bb2941a9421733d35dcabd3d2b0357183a987c054b7d53e5c18753fc9fafc72d59d50c8bff5f47fd234d0eb40135d591387ad869f7df5a69b5be738a379e96e043e93e8424584476566528dab6591fda39ca32cba3a073acdf89da466acc7393b58a69175ad2bf62b7b2eb1c9b7e6189e1d98e260062e33112003dafc289728842e57ad66be5b10dfb28aa28e8a670fb1a07ae1b384f9a263609f90cf9b025c205d8ba94f3b3892090da6e3490c894c61506215bf937d5195f30198794fa3d7e204307ddc67eb6e6a6a36677f97a1003338608a680a021f5b480b3974987618e4467240f8b5290bf4dd4411469dbcbf85b7419841ee52bc1c46201b42425e1e7a72dcfa42ffb739caf8bace2bd14417b9477c5d3cf442aea3414fefd7e4f927282d74f7f270e017b78579122f11229418ca21fc9ba11d08d5e2dab263a77fcb7ae34c7389ba2f855a9926e24e9dd2cb8eca07106ad3bc52a23c4b585cc2971b01205105f2f2d8191baf68f3198643c460dca090d380514ce34b957609a1fac5075aaad4338ddb1dcd00c4f689ed97fa28b245baded336e40476e00dd084be5e54ba2d03b41d2668b0789f1300021e95ac6f7a0322a84cb03f3039ec8ddc0e9f9a1159bd3793b35fc896a297527aa8fc5a969c13a3f701000df582172e4ee3c9bad7b0d63a82e75cc0ca30c23f118632fce5be32516f4effa591e833748af96d5f6146859f0dc3a82329d4dba0e513cfebc0b026d1b9ce85f14cf00d04bb043e47226716da7393cbe912c8d2e0a4b3613237f34b3ff76bf13c57766d1984a3dac56f2300072f9fe96cbfb47492f8dc42b10a1fdba6f4e371c5f27fb15aaaeabef6aecb5b2fe51d4b952713a12e7c712037f8a5c6d5774a4380406f74da8186ec1cd4dac5f8b358cde7b28a14c447dab917ae0db99d34ad3851e8904176d7f7bfdbda70ff7f893d68c71f06d610f13a52786aba561c777274fafd15fda914a97461cb2c121672d7b6e63ddda96c3ac9ed59d392f689e2f2d8039fb716bed5a8dc265c2a980ceb4de0c59a7ad7bf755a9661783127fbec041f3635ed43dc96e8b2bc9140f62d372c75c94c1dc653583576328486c4e383e7aaf7d2b4b9a396e54026f747a1cc9516b42608f916d59c0cdaca15de360214551cd1be3326ae952e249f3a0ff3d5bd4d121d87841208e" + }, + { + "sharedSecret": "21e13c2d7cfe7e18836df50872466117a295783ab8aab0e7ecc8c725503ad02d", + "encryptedMessage": "89f5945b1ed1f4bbe9a33a706089c10f7c0dc4c0995fff7f4b5d9db50e04aca120031a33e1148091d8d3a3138f25397a6048d7f022a71f751e44a72d9b3f79809c8c51c9f0843daa8fe83587844fedeacb7348362003b31922cbb4d6169b2087b6f8d192d9cfe5363254cd1fde24641bde9e422f170c3eb146f194c48a459ae2889d706dc654235fa9dd20307ea54091d09970bf956c067a3bcc05af03c41e01af949a131533778bf6ee3b546caf2eabe9d53d0fb2e8cc952b7e0f5326a69ed2e58e088729a1d85971c6b2e129a5643f3ac43da031e655b27081f10543262cf9d72d6f64d5d96387ac0d43da3e3a03da0c309af121dcf3e99192efa754eab6960c256ffd4c546208e292e0ab9894e3605db098dc16b40f17c320aa4a0e42fc8b105c22f08c9bc6537182c24e32062c6cd6d7ec7062a0c2c2ecdae1588c82185cdc615a346e11eaf8f32cd44d5f1213d4738768f081978420697b454700ade1c093c02a6ca0e78a7e2f3d9e5c7e49e20c3a56b624bfea51196ec9e88e4e56be38ff56031369f45f1e03be826d44a182f270c153ee0d9f8cf9f1f4132f33974e37c7887d5b857365c873cb218cbf20d4be3abdb2a2011b14add0a5672e01e5845421cf6dd6faca1f2f443757aae575c53ab797c2227ecdab03882bbbf4599318cefafa72fa0c9a0f5a51d13c9d0e5d25bfcfb0154ed25895260a9df8743ac188714a3f16960e6e2ff663c08bffda41743d50960ea2f28cda0bc3bd4a180e297b5b41c700b674cb31d99c7f2a1445e121e772984abff2bbe3f42d757ceeda3d03fb1ffe710aecabda21d738b1f4620e757e57b123dbc3c4aa5d9617dfa72f4a12d788ca596af14bea583f502f16fdc13a5e739afb0715424af2767049f6b9aa107f69c5da0e85f6d8c5e46507e14616d5d0b797c3dea8b74a1b12d4e47ba7f57f09d515f6c7314543f78b5e85329d50c5f96ee2f55bbe0df742b4003b24ccbd4598a64413ee4807dc7f2a9c0b92424e4ae1b418a3cdf02ea4da5c3b12139348aa7022cc8272a3a1714ee3e4ae111cffd1bdfd62c503c80bdf27b2feaea0d5ab8fe00f9cec66e570b00fd24b4a2ed9a5f6384f148a4d6325110a41ca5659ebc5b98721d298a52819b6fb150f273383f1c5754d320be428941922da790e17f482989c365c078f7f3ae100965e1b38c052041165295157e1a7c5b7a57671b842d4d85a7d971323ad1f45e17a16c4656d889fc75c12fc3d8033f598306196e29571e414281c5da19c12605f48347ad5b4648e371757cbe1c40adb93052af1d6110cfbf611af5c8fc682b7e2ade3bfca8b5c7717d19fc9f97964ba6025aebbc91a6671e259949dcf40984342118de1f6b514a7786bd4f6598ffbe1604cef476b2a4cb1343db608aca09d1d38fc23e98ee9c65e7f6023a8d1e61fd4f34f753454bd8e858c8ad6be649cc7c5ebeb85c907cc6560be67e24d56e73b2ea3a8555226326e081a7f517262f036ad6050c3bd7fc0b8e830dc0fa46b029c2637b59192909c6d273ca4e0da21a2dcef88d94f57ac8f87f432b044e744e978f450744c29fa02a5af4e64d0f5bb3004ba4dc4e551e73840c6884c62d3f7d20d9ac9059dbd0e0b71b27eb9dc2829fbddc264031e9a605faedeba7693245d2bc48773552e3f8fedcc0f312ddf2c0daa1d16381eca2698c0a6b1a0d7c383c72e2c05ac9972c441929a90cd7ed0aad453fbe4cdbe777e7e11f5e67162fc685bf854357c162e630d53b425da91ba1f5be2f6ef092d741647b6e90de7c5fc24aa4e92ff18e4060bea39d170a6be940493cdb5d11517a1b9b269a1409fdfee6ac45728c41549b36df8050b41d9ac82d54991ecb981327d99ca29702eb6bc2c7329601a317419f41ef39ffd34a57e6100b6424b46d2f76507b8485142ad33a5a0e21d2e9d5f33e4422688365bf66ccb09b1558083fd78625441d6768b97d31e6dfc651e33413d7ac382eb1411f45cbd95102cfa59f25cbe982da396dc61d17ff827fe0d69706fd83d03651a46429e0be74c4bb395fe0156ceab26de12ff56c137aaa5a4d5d42fa7ca7914b2e1daedcfd3b1ec81e2cb2c8d3e7678b6bc9a4a539651a77e9929dbae7363cba8682b8a68b8e9bd632c89ae35e80ae600e8a2c926ef04f3c52ada953f2fa7c954d2132d4276773df2fa2f32ce5fb7e7316569bb533a71a344bf58ae6aabe7df9773cedb111a2d66522e77eabfd68823e3e2574a3a0dde080f5620a0c49fecc8a7c02c449c82b201b69d0d1544a52be68cdada6efe43c241c57f858277a3a661b953b3d3e005f88225d72bc2ff3ca5504af1df0b59496e6e49afa6b4aa0b87755d1c6cff5a9daa673c5418ede4221b11deecc89303d857f13c83d1b8003d6e234fc6f4a3500224142deea890b67837e028a0a6d441e6af201a3f56eeb37242b85ab9bed63c763d947f8da59905038542b8cde40cba4bbbf58e17017b2686c38d4743a80b8602b096a0a199a17973e8717cd25451ac46580ab1dac1c6789326cc0cb175ea5ca2f491d4ecfa27cde188181115a792cbbc1673281be03224f81bbcc450ed439d824a0bb57c8b47086518dadff4073c0682c424d325b8decda246bdbd71de8454e352ccc02fdfc964467e3c20a0c737a528f397f54b7ddf0d297bd94304623d9db0e92ff90ab31e1684dcf803f8cbd3fc5cd386dc2f5004d76eb41079608c47f319f7223210ac3487623058195c0731da0a1ccf35454db8f8fc8eb8a00f1b65f660cf1829039d9992052bbac69d35efc126c44bfedc96b923d88b96fee51bbe51b25c146fbf95f58a1c920c3ae03a6c6554493cf833143ccbb1f9797c7b5b6813bc5149150e80baf11572b5e13d2d6f521609f90b47329af0374a1efc81895d25548ce81ae839d6b2698e456d2b137f08df578d376e5c1616c65a73910d21260f2dac62b08e123d3f75c03b246bc4d33aac989e7ac5865d0a02432c0a5ced5156c8a498c4f4c1477478963058a1fad3af990d88313b1669f0c4a29572fe034b729d105df15c94941136fcccf5ad5d04e0c8bd92ad4724d8e8d877bb4c931170745bab6fd639c5cf8663091edbe470438c6ebd840ea1e18b8110eea53d21693213def360930fa32de3c52784df7ed7870d73b77f503054339260d6b0ab0911c7f9712d1eb632324b73c47d9e72fc7ceb16045ab7c1cd87d6fd1a83a60423796fa24d2c8d4f66fb0ae7ada2276e0e11bc299d5d4a4880c6f987b73d8a51a5796728576c1e188d4dc6f1350c9788ff7683dac85603da1645ec7bd0d14b492475805015bb00ecbab8b2d1e257850aee6aba35f61df9d31485c428649427696db695a2a99d5af068240997c15922b6d05899431f99d975fee924e9d952ad07a8415ae2a3b135c2de443d8b83b30e1aeb47618d0e2c044631db61541745dfd99ca3659f8a0b9a9e53e15fd01f33e60607e0fb71a113efa37f44a4928f26f1026db63a700356c5b832ca3af74bd7083e1c310b0ccb6f7a29dcb5855ca07e5f6c459115add68c4ea42af003c1260b4023197c00bf412104dc9a1f9667c46b4670e526a2ce353c6cdd90f6f673995907b5224dd53e5eb94cc592fa5e92743cd372542ed288159e3e8f4affe7041c874e26eb252e1a15125dfef8d3aacc4c533ccd94bee1d69e805ba4dd19ac56a62953123fd1bbc1b86c25e56385f8c38d88f0701cd22cbe0b0544ade4cc01eeefbe640c177279c70d11bf16ee6f37fd077e920eb3ba8b26670eb642c23a240c4118ec86faa8c55be09c18bb86833df38274b50c30ad130c0d725fbb6a47e63ba981c681f31c964018b63b45d3d0c528529f37d378fdd42722c5e5a359fb43c73d68eab27f157647e40a7645564291b89e78ec24d779218baf470f56b95eb55cf0039a94c10157e05be65ae07e69aa62223c5f28251a13ec61a062cba3447dd8cf149ead66fa78a1491af63595289d475277d16e20378fb5095fe15de0d528d130854db2383b328d616ed1e6b68f17d1cae7fdc34c95b10078cafcb9a03b8065792681f4eb3d241d911e7017a7082c1a018c6f576ce4ba4df8afa32da37265915b854d4fbafe1d0728d49158c5c421b3f7a82660452b6117a6da15928588b9fab4b1e60d4fe8460496bb9976254d1d5763be7ce8b3d9c94833edd18caf72a4e6087df4f6d7c8ef9ca7e54aa8e2fbbd91e6fa6514c106af2c1e56b4b493f96ad87adb5a47741397649cdabd20626ef5efa4083f982e90771eec0581dc6e715a42e5e5f01dbd5ab066ef13827b905efdf84107e7306a5caec27bfe058214ce5b41ad2cb25261666b598d975daddf65fd20209828bab754919a8fd388b9b05f6ef4ca90d67276157504e4e010076f648830682de6c2d88092da092e846bd08c6823744c798fa21b4492dcb0304356ea8d1dc48ad92329e955d1ccc7191f6191697556157321dd2aad6c041b13c04e2514b5f6a20e8a21b891c3711291d033dedd1e7602072893b8b217481330a42a6624392a351e71787ea08b72aa0dafd6552a99469086ab2743b68dd29c45a7187b63523e50915874b0294caabd75c8b5c3ac88875ea987045eba481ff05a0818a027d322f99257ca89b14b630095dfa20780452c916dab1c4b03a23103edc88653c2ca6c613a986169e6ba35af2b289bcb00c77f55ebed6f14c3514d17a603d85c81d7e36e80633683b68529685183fda5084a9fe840089368cc2307be09b09560f1a5d6400540393bcf256e8c1188cd0060687f0be5599bd047a2242a80f577a85fde66eb5e453d6eb313ff00e0302928603ab466ca79678881a04098bba89f368a57a601474fabc1a056eab768f6cf539e76029511883f73161631d5397508ab9538aaf12f156f492382d4d9b571bee076defeca40dbcc8d8db2b2cd90ac35c8431efbcd45fbb6ab457e8bb0287d7409ec6cf0ca04bcb75a7a881a7ffc0eeb05487478738b696a67886673c305088860440af819ac20bdfce9a81e550a27c239205d6fbfb76c7d90b0c733524815165285f4d21db9cbd03b40bb91b7d47c31e7b2368a83b14e180620bb787db6f1b49782087195ca216c4f1d6643cfdc6cff25ed5036c620d591e29d815f33ee2f311f8dabc52550066e8b77e10fe831a436f19f14214471539993a7f39ac1e2f1085b7096e7564691ea6a887274667adbe218267a7f970f83845a9a06941e195388ce6af63d3a6f347316dd781df6afe8576463be3a4d74012caf5193684524607c1cce2d64a5775567d01b22e128c4fe4ac43f7c16328064ca698407af1ffd2c6f6265e3356d153bd1992c2ae33c8728554060a2c9be0902ed8a57671651cc01ad8bf6e9a5ef57c61f1b7d8e14993a07f61dfe1ed26d1313eb1193c198ab93d481d19acaed40e5d91e81c4f17d6bce1a91347ac916c39396f81219e009a565a1abd32ef8d67c8a6422470902a39838bd29415270389e626da3b57a27ff10e92c4e53e393c39b2f5ae4b7e743c10caf16027066a1ac0d886736105896521f82da4a9549d7fa229150ed5544f1c453510e311a92c4dd101f9297c50da34b92983f3dc60ad6ea58ccf529f83a6765dea5159188c6afc30604bfdc521b8f756b4ef354e5a72f639e97b4ac17b6a651a0f8c757948b1ad57becb82051284a4d1597643830633fcb20777a6d2664e50c4b252e36eb1ab6982a7caf6fe755125a02ac7b391b6e2caf5d0a28ba6e18e06b35fb24e9c4ce992a2d422abd19e991440893771e4a22fcb167f23615dab9ac87ab18d24031bbd1ba26cc047ad9dcea2088c6414d7a1aafa22e1e58c938cec27e59c7da3807a3f0614b0f654728933577584233afdca24c18bf6487597760724e6394bf13206a032049dfc0c33516c3de2068a21567050158246712636914f78232868e6dba32b6b2ab473de6bae563c7dbb05a1db0f7f3ba02c3ca4bfb6d3bdd2e69911ebc6b87c8e47cbef6228976015796fd8677b58c6ff9f69341c5cf3ae2009fb8704ea5be00715313542f8e19ba63f215e06c324515506f1545ff91f9763b344379020cfccb506c6afc855532e1db744787cdd72e7429c151c9975bc75fe8b239eb6cedf5c02e10413cb4d79488222ea3a4b4bf9f076cfe7d09ecb7f34ba01f492060e2426e8179dfc00daa589ccc8a17c793e7bf1d920ca56d89b04ac3511e08e14fa1a9637f3bf0e1aee21344375c708564d0e96073646682d4b190a18f0330161f88e1496e3dccd82a9a22ef4d40e353efb12732ee5a52cef43c4ec900edd2dedf2eb45d147d4450e048a67c01424cf6402d6a0f46dd98ef19fd23d554fc9050939ee503adba626905d45c83bfe9407605aabc0c92de845a16ba224944333884a24897a35a84378bb513887c6708629fe7d1d2fce6c1f9a2f90429724dbae20e96f37609f90034bef2062a5639087249ee6123d21bf3aa19fe74023f16c0c33d514e720718e4df48a669e6c5a6acdb0c7dfd28d3cb4ee753c6e9fff583afd706fba3c1f2931679d1f3fce993a4893a5a87dc3fa0037f4dac6edaf6a0d48390164517cac86106f5d2c55ee1b69b44ee3e1523d75a4d99d8f6414539c4fc556425a7ce0cabd0d1f0c748ecc497e5e0071f674831558e22a1384917a81daa0ab77c2f06ea744374c41a71af8d0a0d477c68659736164f4ff09263de7e72266dad50323711bcef4f6d9e744f0b6edab7be61dcde82cf83554fd242f10a73b1c697c3621063568097e2635f5c806b20bd8d2796d230348197e52ecbb10133d6b412fd13278defde7c055bbacf038fb05ec87183ec4620e720fe407b2a7dd67c5723e1d932c3069ee9edc381f93cfda85581e540a8fcdbf1e53b2a3eedb80f8c114b97284d30d177023667ef177593d33a7e985c824bf66412b2736743203432487f01f1e14c13e6276aa04ee19e2aa6595bb5d0de0690704fe846c399696d28a7e71744252e66b5d90d4e784d7f705e06aac6df1b8ba1a298a7d2450ecb3dc568a244cb964f3b315e3d6f89c3b913a5649c8f96b8c926c8b3b7c3bd714b7bca81957da229142dc152ee32d52ace4e55dad1e8076b0a8492623795964101ff4abf3f40bcf25e0043289999b1ccf1aaf271d1025038ae82fa3d731e8bdf3db420c1e5f397a69581f52e082084fa7d27c5689ab1e3678090d5f1d62c5a73fb8e914fc42757c4aa342accf596ccd372424b6f20c8d69a0d26424a182eefd5b55c95cf20cd605c1361abd84ae18c88384fddbc2a2a52c7936b9602699ef8ac500a0b9e4bd800dfdc81a22d555bb3773068e88a61cf93553f6cfe39ce8d0b564ad87aaac757fb2dd4c57bf51b28a1e0c42f018f28fa370870e1574b91d600b50c26ec7d629ce575b68e084d8b66234cd188271d6fcb632e43109407850961bb8cb0c9dcb993a74a61b335a2fbbb623c22ccad26b29fefdb24bf4b363ad42b58ce070f40e43151781a0bfe401df3f902eca31386ac2675ae019a52f7b2e7b1f92e0d1e902e80b667cc917f8e4c62c365785d2bb0e74dd2ae74d6b7e1b744fe0424960315412d3a8d9e12e86d6e398125e72a03878ca75a232c0e998bcebb25d767059ca09ff3d6d82edc9ed5cba02c761d675715a05161393e65da93fd52814ca34eaeaac2d8a77bb7d780189496c050f299e064b0088e48a649b26f41b702f991eec53fe02365b92439d2acd3754dcf803b61aaf424835ad35abd0322b635ea2c370c759d64c2371b5b72b75a9e3afc1ed5e8bed0cba1d12c6cecdf3d776383c62c492d0fe494af34a4a9afc7bccde779d174006c17c8716b998ab139469c8b63d9eeb321145c5ba0de7c94634ce4a851f61cc0066217d7d9ad3584eaf10a12997b5c4eff93c6c5923e4170e1e7ec007a97b591f92dc3a3223c5a23d89c31f3f816f8cf3fa9791f9f96a3273ebdea0f213ecf683ee0c53c2bd8598133164e5f435aa4442b499d8ceaa07a617e05d1ae3a88d942b0cdf4c6f94ab036a5c0cba0297c78a8bb061a58859d9ebbb448e1420716eb230d46487e1f70686eb3418691523b9079130afa5284782c82c3f3143fae0e8117475043d059caa7c0c5e45e5f140f9f79eebf942fdca7ba1bbad47aabc9d19247fa238052aa295869d363c64b8f746b77da59ecc09227dc1b11367f7f685c48ce7420d809a665c1453f296e79b385e4bea0639617c6570c25dbae76f2d202cfdfadbfedc354caff9d706a418e24bbf6b5c879277d7986c44074d26b0687c4abe329194488df0b9bba7649b7871fbd335a0e31155adc27be48bc98a06fc37bc8e270ff805ed91fa58b6c0e0831ea7058f37d7b5c370b25c6fb6250a020cb8025806fc2965a29b67597d9c1f16a2e65f51ee215c4295b7653dbb4aa9f98eabb1f1c86387a9d45ddd22d185b452f90876531d5fe42349278cbfd3a26a04781e4a146159c726bfedb2fc54e5a620f1ba85033b0735bd5e5e67061f7a256a2fe8c328e4e1e859387a36b64c0a788b68fb49d75642866c54d31d587e76e9de41db7425baab2c05b3e84303003caaa55b507ba3dd414c8135f9679f42fb2c3430eccb81733e1d048832ba8d7bbb57803f248e8a60ec053517361a2dacbc60aabe565013cd77f3e7176355b0e215c1f1dc676c2f4477f6f45e98e6ffd86256db457ca7bdaa1403ea1b11961f53a93eaf3a7489049e6d9dab948927feb06557d67d4d24ba8a4c580299acae2384a107425d6472373ed5a798002674ec2c88f33dc9478088c1564749a940728ea9c805e6c62e80703ed04c83f48df9e8068087b47875bbf58a6204ce1ccab31baa760907e650e5261ddcf74ff37ca3dc60efad0f915ad0098c79e4d9157048c32ce90769a3fb2a89a8a8b0bf26027d3fb6e8e55022ccc2016c441c4c3d6a3757cd6854485b5914c8f12633a7e9be494872f053b95d53774ac9d3b5ff5a1de7868da303798f28e36bd6540ac026406546eadb360693fa99c86538972ef5198976e95d053e399fef8f183e208487551118aabe3f69758a0d0f6c6faea62f79d23b2c208bfe44299d9a41f7371295f679c125b039c50a47a48825501c2bf4bc54564c32c6dc8be16492e966ab768fe9f58d033a8bbe162ba183e551eb92ac6016e719848c12d869c0da9b1c74460cd5e635f64f4caa4c967f6cddbfffb9f3ba0e329a472a16653cf523eb4f7f896336c138391079f8139fe2279a198152cf9375730eeed3cff424d68865cd1503b0b80ac791d71b5c3ef0d6ed3fd453eaae36957893c66278f513f523c836a4441dc926fab95269c893333fa46672b20f272422d4394cebb8e3bf88f075aba0ebc9f4864943bc5d61ce46f27d133ceac571c98070e26fd1a5d05f911175868844c90bae808f053ba38ece946a48711234cef503740e4cb1ca7f19057b3fb65eb6344584a9cd08e9bd600c739e76c206bebc15244c24867c3409390b8b37d17c433fd67c919c98dbe4cfb3e2b8b18ff44bd03e593f4af8c91322b22ba46b82be76216c2ef75c5caa83b1349fead85ca5bc8e5ec07603f2f5c943fe588594c567faafe6d0c83e2076c8dfd750a9dfef693ba3ae097283d9e6580f0aeda0990e3f67d358b41a3846a35f5cdb121ca445f097da15a7cd540949ec74796ad02cee9cac383b892fd033153e9e858d2b9aba8be334ee2976249a4a2447838d7206b31a0032205b3d7d4b9479bf8e7a1f0f73ca13f9c2c343f8a1c07394845e567432d0b7ad89efc749ee24abdab128a839f13ef70ef5cd2af827665ad9e581dab0036483d9748264688a52a803c80a10e0cfc8ed20680ad6deae18b810f0381672fadc24d4b1fefc8b82af9cfb20ac96012e998389b4d193ced1d16910b4f13c4a5e8ea98b3905a39248c96a3adc09df945f58866879c5d79e02d4737fe815c054ef0a1c30556fb1b5d6a90a8e06e1243254d047464cbe1e01199977169a9d34c37065fdb08316a3b4e091fb2862a189774c344b7ef29bae35cf0abdc23508521e7fbe170a04a5acbb5fed6e9b53d14ce25533b4978b4ba2ac3ce61e0822628c177ab6c5cec604b3d024169c9debd3bcb777e11f009f016adf54a579055335dde45602baa7ee85d8f12b2d52c175a47e8fb6cd900a09062545f17852fe19f455e766ffbec92119706f5b1c7a235ac2fc03ee6df1725c17d5143136ff18f323b01da6d3b874b16757e4befed4f1cda4da3dbd3b6d58cce4c799f6afc443a4959d70b6f986d16086051a168873b4668a5f57bd819263b54ce6779f5ecc966dfc77340136812c4f86f501a4ebf41805348a4e0809dbf874a3f22866401a438f851803f3e18a1ca6c18ae99fa07e85d0bff18df2777f1191c952dddfc2a06f8a35c4f39b11967e5966aaa414a70c635ab2ad3f9d0b11f59d508e8166539540dd10ec047aa417fb1d7113cc0ebc63880e644a17fd0a499fbbab92688253207a3da4ce0eb2f9598a1519e748979c155032d741236061de402c0a932ccc607f84cfce3306a9068b19e8bf2267a07c8f6ce6e826e4a1807fab5231b33b8580c30d32abb1ab5550761ad0ad55e3a5d0846fcbad2cd40380ae700613001831db68b42dbadbbc8700b502bc7398e2c9a7da1c2c6ed19fa368edb2b5d8a45788592c3114bbbb1d983b74de1a78193e4ca295a2b15503e147bd92c752a379759ebca9b08248b1c55864a03fd462f0d755c06718e71d4fb883c532b4bc6e31481fc2e3958add77b73c9c2e5280a872de14e851d796651635d6318185984d5cba69fc0978fc828fa3fdaa8fbf4ecc661b79665cb46adc24f8dd8e116f75273dd6338f8400bba41bec39a8ccc0014a53aa932ec26b804d8a90f32614853cb8ea46edce52fbeecb4dc55a365fa323fcb49b27a07aabbdf342eb9dfde17fe05196707edeb2aa7c8ee1b693a12b6c62f50e9323ccd69024432d79227f236b2f6a2944290e550f9331fc62216d7c3275e1e42ae4b4cfe1b00549c378d802266018fa0ee77b6ab3bd59ea48e0d884e8a45443b2a8df193b358c137b12b9f1af9570509a85133bea93d8eae0a66a4e9ce32de9f7e50e7039f9a008179667b28912c7b7557ac6ee1fa567308e5be54e18b84a34b9e854e53730a1b59f05b04e77fc362a57497f1e1b53ccb718013c23ea76d47b24f08a61f1243920a0bef1c588d3e6cd13e6a387da987dd0f289bbf1fc97ae19f6e464c778d2f1ef9c28b4779440b3fd21120b09588faf2ec274e6a5dec18d3ab78b696a37c429cd5b28847158d2579ef297a34962318f979bba326593a01ffc0114d8d070e221cc0cf2b56ba1623e1be90a69c8562423cfd6a8c678c59efdcfe8099d5990509fc8ee9d7c13a90d4d450814c28fa653f0591ce698d8f72c8a6e5da0c9650e81c4d4f72b0b34f3dd76c49674d3de5d06fd3aaa7138889ea06734370ff1f1439a0dc52899850ee30f19310034d462b52ab4cf287e5320fc614aa6f4ba02889e0d24d11452f6cd0b57ecf7e24cc2f060539b4ed07959ad3012aefd8dc542d597406e5a07e701a7e24f9c7b30956f9544f0c44b8e139b3f4b79de6405e2a94af88f8709af3bd471e5353cbc3372e75d751e799d01a132c5a4ecc02565d47aa9fc7a968ddd733f4b010a4b4016a3c7e35b503207c5eb0984793d307cad0ccc6678e35e0b3080b46e3131328101743ae4bb89b4a6d3a9af221ae72a8f9f20007865fc6e12d37ae3888bb0618982e273fc35ad063c55bd9bbcbc73b354262d27aafbf92ecf3e9770a8b63958c3be80b84d785eb8b2a7112961e5ce86830ef1fcd80514fa7d2bf740e83cb5634d8ad84357fc86b7669fc3ead8bea9a2cd975423acbf2b5e72069bc1ba1c9183dff852696fd6cb7acf340c1f069d8e1d5f1fd7261a0b96710ddd2ea887bbd21a59b0e7af718bfd358d3f8970df932886aa95a33473d6ebb80e1bf501802af116666c7231de57bb811ddf8c341736e97bfe9b35f04c74d57826c5b1bc4aa9c2bfce8060b50df9f592d84f9fef082a50963e5864897144e0056e907a380ac8a012aa68c3b0e8a7594b71597a1638a9ed8ceda0060b9b0e8438ec71cca2837f71adcd692d6a4caa172111d2876ff2c7e1231bdaf9e4cbf8827523646607cf20803a29daffaf1b2e5f82b2d0efbe8e021363513ef4db3aacdbc8555a3463913038a573268bd5538e1c857573339fbb80df3b52b6b81a233f2e797fc8ca6e99a7c66408d87cd638fb93cb66b09f552d540768b38666b309f76e685758cccd71a438162f7aa27971669f4b722bd00382299382d3b9356db16985eb3bf0a52e1ffb930927c0e39151089bb2f2293a5e8f15aa8db1cb0ecdf171baf7ae651c34bd50a1b054f658d3cd7f7aa462cb29a2d0d1d1c1ae0d5238d272c1f47317d698452e1b4e010908795160bf9ae6b89e60a8995dcfa45f67b5c12dc53e0b301e12ac8d9917d3a812ef85c8e35aae3f18bd768abf5d3838d19c7ea35d3d6a572940ce1a5f7e175c282cbf3a86dd7898f67c4047961fad06b02afe39b4430da74d6fb6d289c87b73f2011ed36b884ec49f6884cd4ab27fc8c91fccfd486e8f1f97f5c29bb57c580b323ad05e36c9f8833285d1375ff4e0260a4b46d53a8539975197321ee5b1baa740b068c9cb89ff63fe1d7eba7e6976ced9a2322eabe25c4a6ff026b60b77ca42a3aa394bcdf2b27063af107e57af43131d5604ab981f4180f33d7f9f26e44c4cd7df7fe7e9f360592bccfc99484f2ae992a02c7aadd433d32f66b2cb47e7e7fc63450ca8b6e25787a927097fb20656314331768792fa18fff6f039c15cdfb29cc13bc77b0a46e5121e556f6bb4b4223e3e54f37f454599b09245c1b73cf5ce9177c0f76c6dc07eedb980fa701865c999e8e4b53f2891320ab00c47b8e5cc44dc7524d3e21f2078561b462d47353ab672789e926d50413d8adcf8bfb3484877bb66e8809977120ce370a57a9254255c2a2175d490d7d6d69d39d90c35327699e4bf4972cd02afe1abc0c8c069797416aeea696881ad3523b3ef3d06118748c88089c6e6cb0dfc1526785cf807396837e3165d0caf9f3bbed89331a3a3a916f7c34408ae484852c27bdd4b31ec372f64187eb6804f0f0b5c6afa08738c08a8cad5a4cbb5cc10b60376123201c4ed2374b674818e9c0caee8f0b8fc2d1eaf345b75e6c3ba1f13e5d5f2fa9e3b7788de494995c059f35914a6595b3e715902de876d562968fe46b8e4a9c58cc1b6e3f297369ed5d7c3edfb441dc1f02828df9658692d3c4d5f90607bf54a4966783a5c07376f7afad63332a87d98af73b04c71f20e66b185cc28eabdeebcf74a322a01af09fe1ea8789c40b46c58f330617f8183d2e266eff22b7b34312c8a91b9aa87c51a29707cf218b6a4e9e957ab3a2d4dd3be0b680ee6505033bf7ce228442739fdf3b302f30aba165514572271884fe82e51e1b1d642df5a7bdb79615d31750027b59ebb5e69333113fedcee7afe91f71e56f0ec23a483e75d8f1e83ba2b1863c52d50b8051081ba9b3ec0eee329deed9290d4050531b02036b7b45ff5fa6e95e73941e1600731c3b3dd8dd6981341af1051482dc4c0fd28088b16c4f3cec046639167c11106f76f53098e841d000bcce37820570bb54d7a4cd6525eb9bca6dd588708148d82bb7c8fbb297e58ac879566c67dc883bbb1be9526a0f58f9ff760407115eb6fd25e0fcc02398c28ed643fde65d7dcc71f56028f5d73700db997e001a94bcdb84953c436ac353a99a737f5da345f83013f80626f8234f79cd1193a6c3c136b82c7edbb0156561b8f3e3658ee3b6cfbbd3d035ae238d91258f5bf946e664ce64a1f679a8b8d3772f20488e5d1701a890341130610dd29b0f39ab2507227f9436ffd09432723acc6417401649d120b1ca5448735dd3b8c948f1b1b90c4c34350561f82a772de705af6587715f0b69d84c6e65d6c60b0cdf0559e4aae08a048aaa749b9b369f3222568e25a35203fac6146d4d2c75f4f80f3c2915de2e6eddff21f6a1b1c5112a103b0fc394d3712c60184247b1bdcabccdfa1719e97f746232531c48d6d97af74e4af9bee9443b90d3c290106e01190ab51a7d00f3becf98a69b88bbb0252bed18da5ffe1de7bddd9871287fbfda68488462678d90e2580477a8f744d3271eb3e0956ab7c5d692953af8cee17282f5b129a084a3b95b95a706824a7f4e7db53e81c1b2593d25b71f8695b09398b5caa1af74c08f2a3094a965eb567647f137c621b3c490106954da922216ffb746869555dcdac7dfa484e487cd8943fadbaa0880ea1e7fa16e7e20dcd81aa7edaca172920225b44941ada1d07c4eef47e5607b766ec8c97cc94bae60b5d9968410cd543d3027104b2401d8c5a4cd6f2c5701ec1f2d110b49f6834423c697649ec7a0920f454d0caae7a6dccfeab5bf8aa164e82c22d7ef7190d59e82f3df12a789956d8e322316cf323d48ffeba00932f1c168f43449b76a65d263cf894d0fe337c7853d9861659e0b404453c6a08ecd5c1121ace5d3eec412a780e8f1ee50b5e2cdd7e360fc1bf8d830c95e4e1a1e8a253821e2835f3614fee7f47178041ada63f5d2652c15b11501f0179c9aa9fff513cfb8f3b905a850314ef3c46257c9ec24e0d69470b4a8b947332b66e7519ffb642d3ac4da12835148f3c652a4a061fb5352e66006d5574f3b931da56310ad8bd8a31341cc63e98b5b2fa35063f3485b66fcfbf905f6af5171729241b55b64565500a3f4e58f2b4a1df7ab08c0de6dd7d50d73d8c101af3acee68afe048190cd577e69d5d87b8b2aa318c3d3b8532f5313c15a3dfc8b51a5dd971d6ff0fe7161455ffb0634fde46e61b20fd73e1695979be7a447ce5bafa0fa5be395db6f8c8460677509219a7ef0644be40e10db1da518fdb49fc3653fc3150ffb687ab8cfae9f319959437638ce79ac75a83d1bcc6d2f897aaf066bada715cce2bff36d935ce6f862789036716c152deb337b44260d203533a5a7e57817cc3bce9b74cc7966d5ca9e51eb4537ada8766318f808ac94ff2ad7cd2aeeeb9234e8826844737b898a8ecff5ce444414e58c292d15f352c193fe6f232b4df27c9426eb428a37f279c5cdab0b64ad8c44b1cc9d58129cd52e399df22a3e2bd881d0f5be8d7c317d858ab998328a2c48e0124efbd8c6f896f34b370dd3e5ad6650c66c3f44d4109cf48e2d58c3c3c50ddd8b106fe616e69de8f83e8fbd902d6362c4cc8e06d56edb4326bf847b82823d45fba3779674a7a2e61625bf73628196a84c86bb0d9d0e065ab2303e8c22696b72127edca59466d059e8d006784df1ae1d64b9de91f0ae69d80a76fed4f6ed196a24ba08a6627007229d5352ea7b3b391bb2739f271adf9b756d0d0173f441ae3d398ad9c287fa447bc02eb0e2ee88c974b777c7457e4ad40491543ee3ef4f00024586f0f09bf555e41d07ed32ab0758572b6f153855ca02cf4d03e51c41af5b3f6eafe1b31d4c25e22261d16e690db35e0e7f391b93972ddb21c42e5897482a6b6d14cf77d268ab70684254b074f8f0d9ef8f5ca369e4e81cbdeeccf16650125f9cbb312f90f8041e7c13a02823362c4b91077d9cb095e0313bd66daf866a143b598fce71f2d4a973750d8fe8871723385426eb4de41cd9b9b5f099c19b6e3b0527384eb49546701e38481d1727118fb8dd736b7b0918d290e37531e9843f9cbf615286bb353318ecc1ff0ca96dd7211c9950b2e0d919f6862d0eb1e1690ad3eddc11ec43ad39ae22ab769a9cff6c60d133d425f1b0ef8988e61db79c572b5fe5332260d66d7e8ac9aeaddb895dc8fb6f904966a3301fc0a0b141bf383e7480070401ae519c8e9c44b3f70da8b316e2c07349d54d1ac987e0634e498a1330dfcf62907ef6aa41bb659e455c73561f3a26109e440f0873fe01f8edec265daaa131ad7137228476ffc794b5f95279dca7eeb15d677c1f844e9bfa93a4c0d71486297d8529dc9f8174db33009c9715c472ccffe16b10d8ee045877279641607396ab32aaa8b68f4cf318edc309e8de1fabd059d46a1a68502d2013d04bc09b4c4577ae4f38dd440746c894d5a173f69e231c81a3648e9e53ac522d8e6eba1181f001ff919fc4a44c69a34ae21a894d11342bae1c484fe5b8ea3d80e74599be41b55dd002ffc53ef7a41b0fabee0ef13e2d6c77dd2c873051ce6fde413352436238a3b16ba4ac1fa1eda4520afe1c8473a5fc581a8602d50406b30844a6c5d7b084eca9399769dc0d09d72f6084cdc604fdfd08af73570ed12d2e47361c2a39c77196b6d168713e66efc12f01caa6e7b406ba4958bd19268f43ea51a610dc477a84ff7eecbe2775793bab7d9d8198009eedd8553eac3e521f7b1331f14859b152ee17396f414d0b86da04b373041788db9adcb4c6626219bdfa23784a397660a59defd3f5013a86906e8f572cb447da0dc4d6fb762c60f4eb5289d62cffaf51f717d80136977284812d7131285ba2035348b8aa774a62398f73039ef6a7e65661e2c77cbf02a38faac10b973cc64c2229ef591f8b5bc40fe6c96f8a18ef97f8ca5aa635dbbd81cfc1c88abba36882b17cab3303b58669cecc3c5c39ba10759554e05acc2796b20a9819415d9d21f9c49173bbbc458d125409a5e5d65fe1eb83503108384be45af8c68d6e52f26617b1c8295b6b62142c3914c97309d0497762a135ce7b82045a5f41bc269afaae9b0eabfccf04e20362d508b226af743b3e1b3e28f55bb56f019ef2f43310a3b0bd9615c1f8a290ac0d4b62d059113e9abc1e2a77f16a4605b6d9a4107abf118f1ee725de05468a0bd84b765fbf0b2c1eaaf9f3e560d7051ff7d8109ad200a754074c6e322c6eae2646db126818a59332af5a68e21b54c94e002bb0c8e960e2b1621ed6c1507eb5dde73961c76767e5239154aef91949ce2c29abbee83b98bb11f33889679576cc843105a3d14349e2ad551caa6c0e95369fb80271aea57239e8825844ebed1c69d32e2fe363b0ea81d8b786c3c9f79207ba9ec40dab045ac0d8a203c57be8d62b573b8e49d7dedaace0dea1c51e19d615a9b36c13cd89904cca58d2c5c508fb29a86672669d6eda27388107c54da2a1fbc28dd7ebf6f05e787c894eee8ee7938be61d5199a8dd9b6fc3c45fc3db8152f397d85ff345776f3732ccde991b35b9c6613867ac5f13ff2ca49fb5e1bb0a6f4cff999a89c83b676a025c6b41532590f035bf3fa6feb8384de749dfcfe055ae2bc6eb3d6a29d78d3e8beb340fba562c1df6fa50f79cf2aa3fc7fde885f07390bdc42900db383ff5dce21533e3b089ee2e0e405c49dfcfe243581b6b5372ee59e3373cc82f9391f10ccb09468e1445193cddfee4e9a4fce2f648c34147371038f8a15207079f56e63030803332e639c5ae458f36a3a7cc1ac52b2c9c169e0796dde7ec1922989b2ba7cbfbfef7a8912fc20aa00bf517b2d424fb41019e716e0aa6af72a5e6c88539b8b344a0404bf7f85aff07826dcce741d2b3bf1cbd0c950ae602a0ab779489642bec43646073ce079257e6bb11dff6a5ef9374099e67a708d926a8b343b379be5ec8d8731740f2dee7fa2cf9fcc4f3761a51d09d84de18169021013e9490b4b02d83ac9e5aa347aead96fa059d05b0b8ea953c0e9069eae996a60a11ab146e58ad697ac70c9e65c49de015f4ff0ed4f1553f4ecb42e7e51357a6bd1bab048c88faac22cd0444ddfd20ca326695bb5d93c6c68ff47855fe2adb19aaf2f52d0ce31c23167e6a3766635f57b0b0ee2e580108bfbdbaf5b840859fc6892bac2f9850b381331a6e8269d39ef1ff2be7e25903134af69ad908c79352bad07b29b5455bf3c5ddf957c523aa4c2930d006a4b3cb7f35152be50801a215c2652010ac5f06640f2b1542f77bf125d3d9db877c4b50dff5819ed4d0f79a53655375e1de36d58b901972a0416885cf94ce6ec627e751847625564ab68906d77325ea4df2b09dcc5b0b22319c6edf2812bddac19cefc70450df5871a18ff69ac99c5774c644ba8fe7cc55892fe45088bb389e078a53ad2d67099d119aaa465b8c8da92eb158e0ee88028675ab3a98245dbd92606c3b025ea1f10bf12f4b1e1f922fb5b315e91925f249fb7307daa5a0c6097c484d91066a1c2e8b6bf8e915e41da17be0782be76d13d829fa9278c4208eeb794fbe578cf0dbb7e4d713c6565a34f3c9abcb2c48a0d8a3b0279a64a650c283826c94408ad1a59dda514366636a1166e3d7b013f127ac7e5eea9468671fc8d6fdfd6f088e6bb1d7e71122d21ed5e16663b4749a87abeed8499343bb45c5bb254da93428cbc8ec562aeac203a6f9cf41d98f77d263d72e0336e80423755715cc57b3e5ac65308d5050bbe3bb10bc54a169e844d772e0cb1191f1712a94929fc024c7239bc6c0779fb06ca6b20e65ef64c93a20afe1870bcde2c02e57938ca21a9a92823c75654f36d822d6b9ca761d24ce5597d9394c3164e5e022a41e8cb30bfac8641bf5f31994ea0c5aecc8e3bf3f07a903b378138e99ed2394ef5e3b90c0999edccd40e00ee948545a50bd6e933651ab714867d280e51c76891130d80424bdef3e3c7423f8f6710c4a405153cd62cc8ab95ce439137519d6a3a1d0f7c8a9b04c37f3794661d0e7c41700d5f93abf14ea8d54d79cfd7f07796b2e7cc8c835a2ec47c0e626346b762437b6db258d3b468b14d367eed9cac57398d5663c0855c0f722abdaf3fcabc843d30d22dd37ffcaa701f86979cfed73a35c0cd54d944964a524d44f474e614e7c9ef65c6fda55da4a79b6a43450e178eb21d389041ca1857602693ae52c1a47fee35906435e0732a946bac1d92086dceffe883699cb705e0668bd826e90e3746e77e66e691e2144dc5b8cb7ab1daf92eff3579423eaca8b8589af10365a92d775b542fc7418dc5c49b7c77a8fec81" + }, + { + "sharedSecret": "3a6b412548762f0dbccce5c7ae7bb8147d1caf9b5471c34120b30bc9c04891cc", + "encryptedMessage": "e8bc60d044af7b8686febd7b1ae04f2f30fb809233ebb730ba837bc4f06751ea7f1862ddc1535f37c6eef4789bbed4d5e34d5875d2cd2e07bd669dfb5f4c54162fa504138dabd6ebcf0db8017840c35f12a2cfb84f89cc7c8959a6d51815b1d2c5136cedec2e4106bb5f2af9a21bd0a02c40b44ded6e6a90a145850614fb1b0eef2a03389f3f2693bc8a755630fc81fff1d87a147052863a71ad5aebe8770537f333e07d841761ec448257f948540d8f26b1d5b66f86e073746106dfdbb86ac9475acf59d95ece037fba360670d924dce53aaa74262711e62a8fc9eb70cd8618fbedae22853d3053c7f10b1a6f75369d7f73c419baa7dbf9f1fc5895362dcc8b6bd60cca4943ef7143956c91992119bccbe1666a20b7de8a2ff30a46112b53a6bb79b763903ecbd1f1f74952fb1d8eb0950c504df31fe702679c23b463f82a921a2c1155802b8866064f7bad07a50da5cf31f8c3151c4c52e525fb22ecf48f8fa39bb5adf932b50c12c10be90174b37d454a3f8b284c849e86578a6182c4a7b2e47dd57d44730a1be9fec4ad07287a397e28dce4fda57e9cdfdb2eb5afdf0d38ef19d982341d18d07a556bb16c1416f480a396f278373b8fd9897023a4ac506e65cf4c306377730f9c8ca63cf47565240b59c4861e52f1dab84d938e96fb31820064d534aca05fd3d2600834fe4caea98f2a748eb8f200af77bd9fbf46141952b9ddda66ef0ebea17ea1e7bb5bce65b6e71554c56dd0d4e14f4cf74c77a150776bf31e7419756c71e7421dc22efe9cf01de9e19fc8808d5b525431b944400db121a77994518d6025711cb25a18774068bba7faaa16d8f65c91bec8768848333156dcb4a08dfbbd9fef392da3e4de13d4d74e83a7d6e46cfe530ee7a6f711e2caf8ad5461ba8177b2ef0a518baf9058ff9156e6aa7b08d938bd8d1485a787809d7b4c8aed97be880708470cd2b2cdf8e2f13428cc4b04ef1f2acbc9562f3693b948d0aa94b0e6113cafa684f8e4a67dc431dfb835726874bef1de36f273f52ee694ec46b0700f77f8538067642a552968e866a72a3f2031ad116663ac17b172b446c5bc705b84777363a9a3fdc6443c07b2f4ef58858122168d4ebbaee920cefc312e1cea870ed6e15eec046ab2073bbf08b0a3366f55cfc6ad4681a12ab0946534e7b6f90ea8992d530ec3daa6b523b3cf03101c60cadd914f30dec932c1ef4341b5a8efac3c921e203574cfe0f1f83433fddb8ccfd273f7c3cab7bc27efe3bb61fdccd5146f1185364b9b621e7fb2b74b51f5ee6be72ab6ff46a6359dc2c855e61469724c1dbeb273df9d2e1c1fb74891239c0019dc12d5c7535f7238f963b761d7102b585372cf021b64c4fc85bfb3161e59d2e298bba44cfd34d6859d9dba9dc6271e5047d525468c814f2ae438474b0a977273036da1a2292f88fcfb89574a6bdca11bb685616874e251f3ad6eec2b842b3cb8076d3746724c6d34ecb911a9169ae724e713c32ba566712b5532b7a88a9dbc39162363ad6e0822382337b7cdce1ddbb529494af8d2deb3815c7b3ffd466ff1c4cac82f3659fb1f2bc365d8cde3488250b0bac646dbfd81c5432d35a436b8a42c5e19e3e4c1d3ded2efa687cbc16ae1eead1513add578da9ed5581bc7d0175e61abd5d6e4341f6a3e3d8f9a0312d7663ee6b14e79aab0fbe3684916e8b8d47f513ffdb774f7abdd2f99d7c3c9acd8d9fe89175c78dfcead6a02eef49f16169413fb029c5218ef7712c6349e3a7596c6fc0128c409587ca39fdaf384ec496c6f01cd022b21f3187c7c422af132f80f873e483d2bf4ff74b88596778c627b4edc8a664a83e4ebe081f258221c67769a642e792f44f3b8d6dc8cc03f1407d11ffd8b33f6949d8fa7e3cff2e6417a46520099f034f5e451745496e4a8ba1febdaa66bc6d925f6a6109eb10a79257730e420fada706632e0df6e563fd044868f43e26ac12907510cb5769f488aef3e71e448287cb600587013ff2647ad8033ab95612946090c27d6a0c10e05d8364e9bd6814d46c49a8c5656c9f6a696381ddc00d0aeb9ad0fa856a2ea21943433d468c474e3858d11ef08f66d9806ac75e3c0d99814a66f3167e430ce400268e7bf2891ed0722e84c35ebda68209554a6d6521fe23d1971f6113c548b876b46f487dd8ce22f5f194af6ff60ae53e8bbc34dc4c66388aafa7e33a421c40aac5a11911f30fab3214229f2ce3199de83db79892acabe27fe99a236c320eba37a4bd25205dab005465418340e61da94a88b8d55e0fada879b150bff0e476f0e58fae12981992b8c841b0c62c5227bd4850d278c6fba00dac4556be40528ebc6f772a754f113bed1d0fbb6005b3d452f674d60be606879748efb147531671437ac0c67f97e38c861316ab47ad5cc2fb08be3c4631fd27ccc5d9847dffc381bd355040e9f284efa8355316c962e30708a005c057c7b3020ee38a3e89a28b6fbf08f0d1b767d23d17d7ac0a9f3f14a5d44ce92b02e581b495b0abfe02b6113b89f712acae04871a1da3978854a33dc3c5263f808b9bc9a4be16316bf9670d8bb7c0ecfff917bef7e7493b9ba12e50b3da0caac4c733231c7d51bf332c4e4fc73fd4d73a7be70ff35bc38ef70c3637adec1cdcb8bb5ea903d095c38984ac40cc9b1b9543e000935323c0135734919b36c5e036015c55611602f6e30acae2613e7371bcfabafbab50e9e611c2673362c929e461f07696746a26709a3dc634e8367867e47ba34cf58d9a6e32ebb8c4707d625b5be8ce2b61cb2476266ce0c8144901bf495367bd0ab0bd0d2476b742b319150ffc97e1c9c3091811197f91ea1684aa504f8bc89a4275db67cc76b4f4adf1871dc1eff1e3c31cd9ab556e35b460c7897d09a3e7d68ba87469ed81de941303c992bb62c4f086ca3dc650683468ed68e9a31823d7cdd45904b56d4b9a56f32daeeeff434f72a0bc787e518c7c4a166de325560457fdbfac29bf38e80de6f8625a1fc26ed67424ab83bb498aab1cddfac147e8f4ffc9a70093762651a24832e1bc2a7cc81bc48a17df9b8ec74db5faed871d20c1f059dbe548d9a129d6e8056fd7deb59e89ecd07aa337c2fdfda5714a248a693f660617e20934096081387924141331aa37e5f0c4571190a9005e8d230e864beb8d8bc5e1cc3ace20c23ef20e92aaf028a5bcb5401b3a1e3ef6a0320f6648f14545f739bf85d00087f61d8832dd3170d72d3689a75161d0760e1ac9cdf36cb63e6a5b209dd91800fd5bc7a000b68d12f1fde1dd1f5e122c0033caac9ed3ee95f09dc884595c6036eb6869786d28455382b20661581e02084d8cfbc9261643953f6f99f14781ac18ae58378b6d932d4b1be611fd0a8b63ee84a22666f92acc67efe290e222ea1cf8eac0c977f384cd8d83bce6643d0cd64235f24a3497c3733171f4ede793854658e74423ad37236bd54ebde7f930be6be60cc878a8af96c905d687d11aa57d95471d5d647ae3c926459c0f43af654c1b0d52b317c9fb862707ff9162c5d48ac6fc1eb621617d1902532adde3f86506a0764c3598315b242e43113fa466370b5a97119a4eac8a0bf9566cb33c777c3b33c902861d935b4913ee8af0afaa4e9f684b32a1775c73b90a1691c9897779a928fe655bfa2b3252f69bdd76361c130f1387b703921451f607ebaee3edacfbedefae94237dfd3870f9dd01d1bc77a4a319567e779fa050797b4a1d8546fef5b794e4d6573963343b8add8d64490f63374f328fc1ded450fcf00808bc39ed543191209ed6b4f63b8f5187ea6c45bfe5896a8214348d3924eef2e36a46e7169c49e73b8b47292e53fe95d6a97b58a45b18b2e59ccc1dee5a98fbc06390664714dca763c106d29fd64ec1ddafb9e74b90fd5ff84447c15756c149cbda5804d2071ad708dbdc63156e73f97d5ccc4173ba087fc96c8a68d05f507741702765d46686ed4152b90ebc4a350752821ffb3071f159eff891d25502c0e47d0ffc2592b56b8e035ef40066268841a291b6f84f87a920d5cac607be45ac7fca2c6c78c72cce6e53088667d0d55a49a45e60063c8e1787cf8200f919ca2fcd02abe57a2b1a36d9d1ab5c26f5cc4839789834414b41c00d62c41cbe6daf96b54e085562bd2a01628b414027ea6ca27554ac346705069a435d886e23f4afb85e98caaa22b0c7ef3e1090d98db4028087d7ea475aa2ded08c47d8def0108857d317c4361141c20acbfac16e6e8272c7e2986aa7b381e512b92b05c7db8fe265225d7a94dc2d5a3fd013d1851b4fca2d72441b5c16be4c7f91771d6bb390f64ad7282f6d4dcd423931db9a68915b335f47903cfbe7f49b3802373cf1b87b5dc20f9fcd97e412c2aec7e96d0b5688f74643d87164da5acd1d4f6ce162122a5d8fe77edeea29946f5931327ec7701405c784f1465421346b0db9e05ace63ca40c973c1889ec5eb065265a10552cfda45b8ca0bb83e9adb3ed23cd1fd27698c96c681f241b3a3beb9276e579ef82cd2c115cfc18864653dfd89cd8a521ad5ed30e17ffee5aad6a0f0fff2fcfec0300c84af4581efedc66b62eae1a9179ed42e84b52f5766a368aa29ca01b78014bc06c7444675de5131499306a266cf599fa9954088e4d95339c90f78dba4420d1a627efee72634486632773993d425fccfee44bb39c1d0ba96f1e53891bcecbefa35cd369d90735d825969b8d95d27aa835fa243ad0b40bad0c66628d8ec1a5ab343abb534efedab798187380e2703d93c98ab2314e3391bedaac83817d34df645aaeefd8905e8ba0be9fde1b6598fe6a011be1e05da0c46e9decace26f7a82fc14d1390f18d719692370141dffe20e65332e9778e0e8f0a838a2e3342c3c4cd1338393f8e04bd6efd8effd05fdf7d0b442b96f993569669e4ddcde1adcc19f31ea39b538430cb53f18641e6fc8a1d614734d0f80fb96034a167066e53295c4d6a1ed886d0a340a6fb9d4c2a049189d4b799fadae26a835c0cc975787ff9813774632c4035914ae01ae538a38ddcbc9a8029e1de889eb4a68419e4ea96ade94ca406583501247d88e50ee3b3f186eb18d92fd1b543e9d40d80c799b8882c5b47d8a72cb55cc9d1a8efb26f27066f65ca70c4b4689767f1ad73337ee1be185f30fbccbe53754134f1c2e42388318670c47a4df633eacc323f0822bf044820ca3d8697e98b35fbb943b2c211f6de8c24460c89c1b1edb4b0d6e3facaf252a83611026062c649db5e61bb205c6c88d724167a159a2ff2733a72499a9d3171583ead030b6cd4f2622220987c9dc3243c00e21932d6c167d4378672a316b3b9e4e6dcacea94294aa5f23ab96d86db20b9ee2a3dcbde9072fcb72bab630db1b34033521e8468c9bcece53d31743309aae1458113d8e626d73b7dcb368fdad61add96e13407d332a9e7438e0c3cf7d9aec42d4a5258190a730de55d16ac0dc8f7ddbfd032fc6d274e7e68a84eb2591d420dc636b786c8181ac57fde397c7a1a9fb99794a9c87b82a45de5a08a6d34a46b3776ba2b543d98118f5eb5ea06a5cd8cab75ce2cd77addf106b17b8041bd9028d08b41028db4d3fc31745fa1c16c0cbc4dcddefffa21f4cb3a1df8e1032fef2380fe7c9de7d8f2994522bb245c21be41e504dc3fea95a0cbdf600c6c46298bf5f8f6ca7f44108bcedea7ab4eff132b8939852b8ac9ab4e935ee34943a1847471a238b17d6af2e9976d3a329910a0bb238fcfe56c87e5bf01f5d5f83d2213914de5d1bcd13b58cd5ceb4521bb6cbdfde68fd515abe3b5b5e6569cca85788371c794c0a614231c872639ee4cd3320a6daf443681d1880f282a47801a5c9a15ae4e29635e102d34251faf493ed1795cfcf712f66514855027b0a70c5eb7e4891835b6d1e517a04196166405e17690f0f930b5064d3fe41fa362395ed45e6138443e4e23a4becc4066e827b4c454b84f1b38e30ff908ccc8f3c7e1abff876734bba5d4899c511e5e4fed2e5ee2de96b38b5b5229382cc699c2f69b79c0b4c38e95486ada0e37b9c2c0aeb48d196672607fa90e0134db4e14467a679d69c677445ee504a4063f411d647910188f4dcdbe02fbd7fa5b50c51d4b0096db6886890e931752842822246c6550baba50174b60b889c0589c1c54fcb67c154d96c3a306d7f4f0267cdaa21d3265b637089979a532489332791137164d2d55ff5619f9431cd2b5d0b285fc4371c9d6c85a030e6d8d872a178ef9dbcc62ca50186fea69b14dc0ca5399928176867f0714201fa9c8e30cb1e063bfb65041a3fdb94460e4ef683c9068928c0236de7ae8488ff1593caf1260a03f9dcb5ba139158cd82226c8b7d647591cb787f5153629c2b918ca2b5972c874440243bd46a0afa5129a5f99c7399599c72797c7d541904c0a0d97a6f514cc87812efd291c31ce9886ae5ccdf53b8082aeed4e9deea20cacc8a554392a00a8d35ad4b33514377fd809bd49bb9655f98a46079a7371ea22dbe7c7be8b12811f7f4311f07a91db575c30c9a62ed7152eb46cf5503a0436af1ca547675a0c716a68885ade4de91434d7ad0149fac2380329f2c1a71d38a185768b0f6ffe6c1d4ac8487a8c3e6b965cde9fec1ccbe594298f8266050541ec8da5352ed7bfa20fba230efd42610fc548513e6ddddb8c5693bcae0b0f9c3f9c9ac6f03570ad2e999f8b7a88c0bbbda39a27ab85233047ec63e62f54e63351e019d65939e731e691f6f50cca778a169dfd433dc5eabde5f6931e59ab543facbed58e1c5154c45b9798752ea7577fb314358a7157e29959da92369e98ccfdc27a7fc6e572f14ca331ea3e07f4994e3ea1a061e5be4ed32c53017315e45c81c30529a1c6177549f26ba34e1ff955f04e562b1d21759c94b11a22e68abe828751aae86ff19116ce6005b533f6625abfb954133771ac294474bb8e1b0c7e16dc2cba8206cf1475b5bbee1634e6eab9abaad9b41851ab48982a143374d517c4d968f1b2aa414f1cf9d174bf2f8d4adcbd43aa47c18058992ef9f181475fea3b6b4ecb52f5e69434034903a3349ba88a388827f4ecdbdc40289e66a154395d069d50bca7d7a912ee2f0a08512b3770141e1e35e44feaa9aa82eca21336ae7c7b6c2a6c028714d7f0861957d41a758c5f1ce28ce8225e9ad9088f189f8ce8de0ffa7a816109b46712eb8d5d4a23d7fc713553b9eb167f4949790a519b07fdc29ce5d77c7a58a916e9850702d5452403c392af4fe7983562bfa033af9ff0558384d428ff7be029c379628e6be463922c324aea0421e025da62521637d48028aca64a910fcf3bd2256f0d3d11f17eae820419b25dc0dd966b3150f74adcd9e1071d253543597bd3dfb1a0258e95a379370a1d730846919b3ffac79b0db6e7f7ef2726af9afbd87de39593d8e03ad6499cf928c85711aaf07a9a4fe2191d402ba8f30c068255462916ff4275e6a7594d6f6719a2d12c8b2a86d161750c2505ce64b0d495ed2df21c78eacf1cbd67747fef2dd22ff60f20a6e620ae39a728109222bd549e4a5e4781247407f3255f2c902e4515f9278bd2e61896ed72c0fbcbabc7ae1431c2ea643b6bc777d4a17c4d96e7168749d6eb2cb8c5404505e9577d88867dcccfe67c600668dc78477fce3634c6442ff91107a384693ef139449ab2a46de4d2486a37ca63bc5e4dba63bf442f5f676e71e235bda800eafa70d448cc324d74251bd6b41634e489a36f9e5f4f57c891a194b81947cf241cb3ed8fb0ee1dacba0a6b34293c0cc07fcc3281578091d71df8414ed000766ac7841245605e4380becc5816b6e6ae61879b0968d4950ae8f49abf485307c0d145b117a2b30c5824e90c8be36ea10965e734335403c0df6305abe9f4a8b9e8eb9049ef7c1389836579a0117a50b34591cef98f9a7d684376c84ae081ca587be547599c49514314a9d180ccd90bedfd79c1ae40173567bdb5541a6bb173bee06e4bea85dd4706e7a2ef131f6db877dbf45aa0cb9627633dfa2e4bde1aed82f57cefcd9d45a0e4245ec4fbb6897df941553daa312cebc336581af7d421bd63539bbbfae63b6143d5ed52055f9ee881da94995c0ab4fa0b41b4e240a4c327d005a59f3305606842735fad6c15888d949b076a99a3de5b834d727841ed488c5d2216629d895327e151725c0f2c92385c08d3328a1ff388ca5b18069e1a1ac36d65ef3954307e65b363d1c2ba00e7fb68a5fef096e2a67c2a892b8509958c7195ffa1635c0bf4d5e07d3a394f6e1e5b669331bbc808f832f2e49051dc7354b00331cb0843645611bae648a5868880e45715cb1147b165a2dbd8e48696afd3ed35567d4ea8c66b56ad02b87ba1db05f1fe73a2a3c0e6f0ce40b6bf6c1275c393ea2aab951d9d9153db81916b08cdf156a5444b1f096d0fab9be625001d727cc36ee1d9bb26d47e115c37f477bc3d78dfa707147e2d25679f74ee09c4a23f56cbdc38f66e0005c79bea047c949aea8a1bbe6b94cbdc8949fed4b50cbe2e4c68eeb15192034c27ab79d8caf315ecec5e1b1ed840040bbff607ac8624350daed85c85c8c1d27707ad04c99fa6b0547318ee1e92a3793fa2c4035092d84839aa8d9a884e8d10b65676b3065fc627e15444dbd86148d98f2166192fef423b5e4557111303490b77b5132faa57b5c1ba28598fd5696c393d63c90dca212e17fcaf75ea2630566b15371045404ac5f874373bb3c09351fce504d00697f3faa328ce58a6418f9248f1043ac1fa3c663b76948a4047dfa638d97157a8773cac0712ca14e58a743a0491702e5c2d6d1712d98d764b15404839a7964d9cab03e8c7614ecfe0c3bfdbd06b872b10736c49277a42a2381392f93f1103403c403d1d77f372ba72d0b6b85a048fa8eaaf85906efe75da753c87c5823dfd3aa7435ffe38912d1064620c1f201b94a3ac356cc405e054e422b326a15de96a8960369ccfdc5ec16e5f065fe0a51e3eb489e3097373b64bd0818afce26633a335ff4894836eddc8e1d6ebde1fb78322516bd7aaebf914df71920f17cc04509f67912ebcef7097e5d5831425c1dc5ffd08309da7d2f2e27b45cdd9c25910079a4248e62a33c8e6527383cc49bcd9758a4ef7393111b60d3c83dc869bfcfb8bae463eb0392bd47e89791df51c56bc302278847da865f7943093a6fe28b3ee7c4ec9392d440e492a96a4a34ec1ef7632434f7455b3586879c6d38589aeef8d50042a2b8fa85c72b7bf290af59edaf1424e4ebb34ffb2f5439bd020758416fb37eb9b966233b1f08d6c32f4e04d513a036b94498187324abdbc131161506567e2d7c55868fa8de28ac99573825f581daee2b906bf363d8d9491adcf2802974073a71d7d2957ad267c11b7b5e9117172217113cc2e7eaacf9e82b676a759dc2ff3f3e2413f405ded0c6d1c73ea0b2db7faf702357918fa612e94e0d3e70043bc3b05cbd7229887701918d08b66a37e499cc62b54275f7aa14ed9082d8e9838f6007d2f9ad655bd7cb33a6f3521962f5c9c3faf91a5222bfb307f7ab02a9d0615150dfbd36110e5f4e829019f8b261642d83559c636ab76bdf3c5828f3bffd4a24473c9b8191af70ef40b6045f9e307edea165a196b070772819e861483c375cfb83614965372eeaa0a7fd271b9672ee8e894270ab8cc6fa39f38ed69e99dd5f4139df75d2d9a4b706388a461d1cb52aae8e2b9a738fa37760c4bcb61d96df00972cda775bee0467144c60be9f8457ba6950491be5bf62df0887d2ddcfd802682059e89c11d497928a9809989a4dadf9ef9c226b9ef152a0e67e87fc04b38fe1706257936d4e619b7a55ab15dbbc053e187c0614efcf5673ba7c1f1f424b63aac30ef1af08f679a1c348487921ca68a88e5f0bb36cfe4c2b95b3949c5af2f452ba0527b2225102987a8f9a6cb4a3fdc6f523b6ba41656cbd497a1f04567e232a5f7d9e5d053eebb66ec405a195ec5f65fec22951de0445f3d5684dad3073a6400cfc0d21c00e2d9c403342fa792e6a72c6a81be00751fcbafbddf6de410a315ece59d7619d86d1990c3bf6fb52f986a24b81bd29e53591fb1426c53ac71ce36d52eda88c7f49999378de70e3c1f55aa2cf2924f69e73000419588302465ddccc73ec5ea3363ed812f686847c21ce9bc0d88322ac807ad89db6cc74877dc7b0e7923cd58b1336442be71f5b1a8635a4a1d12be63ebcdee1a8b9f963122f070ef065ecdf912c4178672eac4d594b52c315aa16ebb4853614d40561462f7c76dad688dfa1254630644c527097aee776ca220eaa147ffc8a6d94999bf109c94a9ed33b067228cebf971734c701ed043f6483ac99162fdfaac60248cd93eb8282d7d04e4e0ddc46e7c43f30d22bc00a1928a54fbc623a09d0580533ce75e5d3cc5102267cfed8595ad2f0c31e118ad29af255c80f15ce6395dbdfc1cc8939298e5e9d7a98cbbc590abde537e043dd47022adc655de96bdbbf15d164576b94aa92ac0a3e6e03154f5e61ba8b390427cacd39ba4a4c946406cdb0b7cb98a3b180452aad7be31a1f88ddd28cf5de72345ed8a73d5d5fa4e3b87473e95e29d7c11f1a3c00f3e6fc0f7d43822bf2da0bad5d7505b277b16d02acffb8a20c789670310344462d30bcc78034bbd1e277b7f24ef4a23a713c25366e085caf6871efadf8121700c7f8f8ba97da0908ff5547d68476324f6077efaca4755c60c78ed0b50cf58bd8d9b1a4ac006ee95895954eb1c388a175b1a808e528d2dbea57da3bb8c04c22cd5a8949be28be727de00e60de34e924b79b8edbd736c5ef3ef05daa2844dcc93f6373921d22952150734e396f251acad39f084f36ff0f5ca30c3ef4a7e8f3a89d77c9db302443e23e2bb2a90e6abbb29132c646d97fb361fb2ba3134427300de0e8a8fdd3ccbdbdef086bc3790451519c3106906f0592fb8439ba29c43a9d589ddd56427cf2872fb9c761379ed9c00a9d4bf33e172c22e6dc9e44a1df4b3891c30868fa3832b0fb88b986673f230549842e540583c9dc463f318b3e720682ec304c7ef64c1bc5f2bb786640da6b76bcd3a42b1c579054c3e91eb3c50ba85a71967371bf2ec043e56c709e8d4a139e868fc403e4a888dd474b838ce96657b0b7bd1890825ab84453c63d3b2053fb75e6487c13718c48478c83670c4db9013d953e18604d78581c078d2cf1508c267b2f811962a4d90c69cc2a7f3839099053d31c3777e0b5f5a14d855bcb44e6dd4e419a05d668999b9a99f652798c266e681b704020867637cc410b23c51ce5425b8b61972977883d5941d8669c1f4d40056ad716af5f1ad0c42bef66a69f64569469ebcb8541971615d41b18d74d0091a8b4e9acaae451e1139569e2d619828bbf331bb21c2e868faf582af60ea5ccda9fc747ff9d8f15cb940beaa1d38a70f2a1152a18f27f300660e805e761bb5ce979deaf76660347c2475c9e9247f1a37f4c493751a34f32a0edc893e006ca04a803fe1bc0be403e7e8c472c152598d9c3026342843ba97977d075dfcf779b4c0605fe1c94da501019f2dae3dce07bc7ac7dfb8ce932e4821fc35f15ceba0345ba4709ba21671e5fc461660d63012e2583b6d684b55fabe9604458976eb3f8241b4af146a994525be9b8014dd5d110a1fb77e8e5ef877e6ee4be171aeddbcaa1f8fdf835042b23301f7b2ce759b2abf0bfe09cda39c9b4eaee643b02a1a157410ed819ad0f041daf1430343810c92bb8eb0d8fc6604333e71906baabbcc3a8e50ead55fc48387826c440fd6856f98db165fed50ad49a62ee112780d10cf5803d3641894f0d0f7cba299aa0ac68a30aa1cea2b232d0d67c3316d37c34c92a5a03c83534aca8d28cbe306cfd5c883b1c7edc86e303e401dee0fc4ffd57fbbdadd459c02bff7a2e85f23810001f2ebdc0de295794e4c1758d561e8e65c2f383cec339a70cba0809d99547788baee58cb80cdbf9ca77b39833ab5fd0fe732da76bce3a72f5661c53b1aabf68f3cfecc9083371d56b112f73fbc866f21b2200627e921c8aa456a815bf8132757c7fc65b078b205d5820acedf2930dcd38a58ee903936baf2ef394842c7cb7f7e78726e742d7bcf62e9f0157c2be27173317287b38f8bba030d0e50d9d94b783895d677491a2f845f98cdc3be6fbf6b5cbe8abb5f7383f0908f7ecc580dd5b44f5298e97e190bee191bee75e8d7a6e4ddc19e7b9fd4daa9d3385f2fa80fdf8ba2539bf228705887d64d00c03b9270949b3eebccabbe0e86bd2ae714705635f52c507edfc9c6be5a337bbf2d75e499d76ecd255b426a0aeb5fd7a9455bbe5db54cf80a8ef69bd83a3981e0f325247f7240ed05721bce6582ad9d9cd2c474d48f96f24a70b69760e8165d256dd0c99991488a78361cf54e9abda232d4aaf8f2965e2f43a1298abb573393ca01bb152844b98659252af14acf80e58eb08f2551244d56ab7ba31d3d5415cad7bab57861250b4a14673a841534251518fa1cd89d00a8a4c35ba4d14e6430959eeb8af37181985642555dcf320d6d670dd25abad5f3bf30e29ac3b521437d4a06340eb0b61d0507791c5c5c3be3d4497c73157568fdc8630b125e0e5375750116e6af9dba156d98b4f0bebdde6347ce8f8062b5e829c6c2404499e167b6b93b671d6bfb4ec7609c789c69d0a2d822e75719a50f14fcdf7d1db17c836a53a119ccbf85789db4f583381bfb4419eaf8e45ab8ca399155e51d33125a3e6e5fcf025fd785af6d08b3ecdefa607a8372fc4dfcec160ab900a0b82aab071da368faec77087b91498f6fe90c8bbedc79ec9dde5872f3c9fc5852202b95974eeecef7ddfe6793d09be01a53b464e00199364ecf71bac6e090cb8f7b547831850a120569d2f13fcfb5aac698fecb232e7476d469f21d7ae632da6cc7fe9b3056ea8e013b88618f295f2701d02268523c2cd84bcada1517ccc2fdc0ae06721901c8dce0e3d894c7ca5a7dc983a782c2ca6ff555e73043c85356939335329717e1b0d68d4d4eee5aa41b5201ef46602c994217fafee81eaff139d86dfc7acb492c29e42c3d92779f38a4e702da053cf4bb318ef17de19a2f6d04b60872f9fcbb2ed41a6348b01ae8dddfc66f45488ccbafe51ed02aa5703c4fe655cf60840fc270533aa6a42239aaad564f0e4ce23e0950903169b9e715a5e08a629b2ac4ec1ea3e7772dcb9ef4d877099735b746253f292c4d4db7ed209695a16d994c77ed414c446939c4e63fe1bc24bb0f7f35a8a75aee2c11891805c92276191ca263797aa5ce5a75a6ed5f3c1e01f149605db96ea4b787108cb87eed236a1766c9026f787e568ed1112b82e7114db5d4903bdd4e474b498a2af8c79bf447ba29a48000298f4a3e68e41f05a8c7e62850efca43ba62363cae604e991f078fe495388d6e55e9f37c94be5b2ecc75467f2d3d39c6c8d02391f1bf581bba3d8a2777153ad07869f2a0a5f2293d927950514a9f5f1179c83e4334729eee381b2300cc1bd2d462e49b0c5af5c7c53ca1268ec866a7688d552b031ccc044c21027ef735b9fa4dba0e9de615c32d0cd6c58e15978ac80dd3b940234defcd540818dbb04e866eac8081c54cc9a27be7c084f6912f04d4494c5f8e4d36851a63addd451cf5c72be7877edcd1d235989e2607c4229313db63c916ee3df15d4dbeab3b61e29a66d1c5cb2b3a930225c8fc32fa0f4777e044b74f554011c70f6f9ab4644df6da0107559b0eaab87eb249f07bda1923a16a5c0eff85f9ff42bad253712f5ff60e5837ea859936adfe32f911b3cbb3149635c6d8de7c2fb44d57cb08e355a62b46ca55b3266325d43a74cf8ef714cf515e82d63830b616b7256f8550dcde4c940ed8e31c55ce98b90034816b037db1d1ff9bb2eb88b1be4d5f4d2548ab3df6589ea38dc8d3eea285985aff8112ba9d5f23f634ea1a266e949567f33aaab3fae1ce1623610fc2f180731b4b530a78eded7c2becb835635c848d84e335d2185022a93a73a0c3677f845caaf69f3115f058ecde4964cd9b833d2717b65b27a3e263ab9577e42f1e842d96bb8a16aed64abc795e21b90330c0f0736e4c25afc6c11ed29e31e9f74486994531de3f98fcf7481938462d794886df7e84ced56692fb7d3c156befd8b26894a98b70f107acf43783301d672f67cf5e48e7cb82f367d921b47ab1357ef3b52b144e000a32ed295265df96d15ca8eb5389d24020505b2f9869bd55acd20048ae72e8cb0939ecbf1b982fec653afd17d6969eab8d4aa6e1f12d86d9d0704f5e6560b6950983ab9d81d786ab42ca0f61aa407e80c407d50e4e795107ca713f6a5a659de6c2fcd5127579d32108d2f9c362c0cd349ee86c80c30316757888cb3d021c09576b30d86ef8249d3862cf8ab592524ec13baee482c2af59190612dda905b2a9603963264ea5040ac84e96dfc29da8120813d3f894618a0777de36bba107e11c0c65c69a3c0f31c9a69d50c6e9934b54f4444d3ca670a67d7436779d813954a2099f118537bdb9707f721fdad1ad10e819019a3cd112c80ef8ef2d9fede68f227d9ed8d2d966593cafdea94aa291d3432815671381a8ba9a4c434d943f454f47c81c8381cbb25746207194fc77017af3ec8fbb17c811f1129796b4097766b6866c99b53a5b435bc5b4248c3db0fbbfbcd35301ece90175d5e7d1270a09241c8f05c9c03abf8de84049ec5c2c8480b89252b6575023d9a78909b457bca82289faaf76549405879db67ccbff40637db9a6ca520d2b27c91b36f50c4f125ac08c4a549c7c69ebd82dc5591d5aae5d256acf47787c57a5b66ccebc6d13d6bd51a331e78afc4274a25e17a5b37f5275aadf68503fdc46828ddec51eed9ef417bcb4e42f0ce4f3cb80477d15759c46e95724579df463521584704973f748b0e54add3d9f00d567dc2b94f874a7d51f6903539ab44557979224ea9b9d9d83c56e160bb1105e9ea84bdfdad273d089c1b102154861df4c9ddb18d5250b1c91956a8b216623b137485a6a1da7f85c69c5ed49d8845f8bfabca5dfb180bdbb2b90ec682185ebef93ee184e39a3821d5d750f3ef9db155532e48a1c440daced441e80116553148b3f661e54a7107cd67c82324c66ad9e6fd9918c3895991d8ea09dbebeea2edc12b79c8da5d38efa0befa4fb3fb50e5d6ca61fa990ec841d63009a1d1baa96dc8d81837bfd9a3d1396c2b18b1a0113d4e1a3147ac4cd05b1d4f8f4b6747c193e6a0f7e489d8be29e3e3eb49363382ed9ec3a97cfef334a95bab2af8dc4b38ac5b06f055ee3e5c6151d996cd66bc02be37e3c767ee17227be2128c21859fb169b1c749e09449be931ffdbe3aab9110f21537afafbed49a29c70fe40aecc36f234c392679c1f75d1464146af788b7cf555dbcac316c17c9d47583c025354fd9e827281b6f11d2b655fc483fc88d5925942c6cc5909e9e0d168717ce35e7503a0db17211d2bc49304c18cee8233a7404aeb6e3bbc36ce183892a3a0c26ed1ff20cbdd87d58cbb1391a70c98a7118af062a15d95b7d5fe450bb2166086a95fa05b37417477d8fbc99ab449080607915288db911500764fdb7bd66c256b106fbcf519b4b516e50ffbfb138d304e7b85e954ca112e4a67c96a7c87921423cfe3a6fb8f43e6df9c978b2bf5e11088cda07bb5e55007341fe6a2c0b45652a551caa5c2157bf4c8f1861952033569d33ab2ec9a787ee62cbfefcee383f1f1683014570ee7aa417658ceeec19b64018d12d6ea2322fadbd90b76a20a84feac27c61046361ff392a4a8120213bf21b56fc603fd65aa549357fa1000211a349455f46620da65547c6988f52109238c20fff5e8c27cff78465c1dd86cc23cbacdf339bba0810f84f0160a5ac65630361951bdda999f6b0a2408e26b15f59e4e64c659cafcb374582d3b4d97e33683a1c3d3a590ccd9bbfd42975cc36864cc5170a66fb8b1c536db378cbad9661ad3090fc34da5b32ed52174c9ea2919900cc45cce0666e836b4cdecdad0b5e437157ea08148de4629ba68c5736cf986d1fb0aa5ff9d65e0d4270f52af60ed848b92f2d8eb9021a24a8b3ecd41b53384b735b8d3f4376ff84e8ac858c4e132cc831e1b7ef837991105f2a7dca904399699d6abe61da19ac4cd8aac031582bf459ec8b12d2b715a37345f777bbeb4c4a9d6a5198cae6221c8aebae263b88ca26e4d924fe19fabc4e7d3ef3e55aa44fb8357e894ec44b59e3d65618a5437e43c49a68f770482ebe5bffe6fd37729523e6a46378129375620a9f44c14bb4b738da20b8d5fec69219a15d6491e4788c34437a02202fb64cc5c2fd451c75cb96cc07a3eb5c601e4781269e6cf6ea452887cd42b79bf5900337aa3da6c4cca1c63ed07642effe016c1d1b62d615ac50b9c9e0fde309c495af752586b70bbd993e00d1729bd178620ff527b9324d08a6e0bbaacb8f920b1cf61d02f02d85e22c2441ac4733058ec9a6ac2284c3bf63253f9cd8a656e27054954ea9af0ebfd6d8bc91abe0a4ec779b5858e0d6c5c1f2d0f8053c64142280be4c25fda606f06eaf7250b7519db8df2c223bc86d18db25368678a78580cdf870c645105dc5bd8c12df024bd1afdefa70cb32e74e037d8b02adeabdacd2dff6c90d1448241a651fffee0f9bf7fab47f6cb5c0dbd2a8c410527ce95dd350ca8655bb5249b8915a81dec693d1e43c797f1c2db10b0cf633f44ea8f15f8745656bf97636319defabcd02388200e674c2bbb12154fbe7272d50eccaff38618a449350c67e369983c343216a65658888cbab5dbfb462c60e46cf066ef637aaeb918852503ecff049e1986ab2e666ff2594efc20e1b5e6ba8624c410367a67aae38e7a7a0cc93d36f89e1ac27ff565e5a52169ce5348b305b519eabf3411f67f9e68ad4a7b97db1a25c2fc0f59084de6226a74c5732d0de281b42517dea495306379b80f8693678691d9bcc6cb73279186fdf9f8bc8fb0356de6cd985307766591ab580c4513700fc463be627e34c11ab4a87450b6cf42f6237f22d12622beb85d5b643e86e135465e4035e4277cd4bf5d09c38aa957a450f0527b1f8e49488a2910abcb8f1274ca9e8890b0ff4ebb1b449db19a227698a50d59c18c65d2781313d461a8855415b5d0f0c13d25aee83f649bde66670b9c81011dfad8297bba18f2fb027ead18cc7eb50f345e5729eb69a8274b277d38238fd22bf2888abaaf41b0dc69fb1ceab59780836487b32e395f83457e594b6e62283b356d914b29d6fc1ba276650ab0e82e0441ddad7d878aac95d8f5ba9b91c1449e9c5050b1fce8b946a0ca9fcb44202375519ca4776cf78402c3c476be69bc058f4bf5582b4c7fcc9b38168b6b0473c7233ccc9137949e7775ec8a058b03cec714979517883a9683f1f727814044f731f0818164aeb85959078ab17b831675e5cfd580f5ef63cbcdd47abd93158a70c92b16822e746305319783a627a1a1e73a7e6940a67defa51e7eb59cf864d8a46b2a9aca0a8175d43db9011115d8b20300ee59dcaccc9064d6773c0db472e210c666baf7ace2880c648fa4ac80896ca41ecd98d65d95a9a9b8d0e606e61a46f3ac3490e0a6cf90123ba5114177c4e429c9368cde8f164cfab0e83873550867a98aa116e07379e836f252d221f7e442b367790eca0a0fd14ea3d7e0bc4f8d4bb74549291eae58f00c2644023c666aa67244b74ef4a43fb93cccc99118644d452f134c945329eb1c24f5a6262a539a08398fd6cc9141a39bed3c2d7331999e8ad9996c45999571465f7160d5d784b56bc520c16ea12b6114b83a6ee92772268888f02b1b4fda774820dbb6bf97318ca7d2164dec67a85e8e4f0899a121432a7a71a2d20e16de675d0be5567c865c811e5ce11c51c21e7a37cac741eeead3ebfa80ec5d0db69b57fba7352bc982563749e9301a2b5eff01520883cdc5b1aefbf1e426053cf28e392f80536a5cdfb4afc2012dfb0207d7a7959d7c133ca7a63d3ef19c72bb576dd8161aef0fe7a0c46de5e53732d3759aaf4a0cb0ee2463715e3c87f04e55a69fcd78937a82bb3d783b8e8c2d69d2b0a2d2ec5518c0c7dee59c835e06357843b80ae85c79b06b62ebf0ad4119fcf88af77cb38dfb4504653c367ab3436448542f069a940ee8f1e8d5346a75f539e31dee583d9766ce6e36fc2bfdea8a20a876feb8653b0795bf84cedbb542b62975c05445e9c409b8ca149259afc71400d200ca85950766d9512d70a12809323c5ec1b95b85b08a0bfdddcc9424e60bd2547e3fe5ad5c244c0526ce46aa013f8f55bda77f683c357378f0846f2db1c3afcea165c5e5384ef2fdd6a0c0e517167f3a6fbd24fbdb1b7b4512e3e66b812626cea276eea6eac9bbb1ac061cd3985cb250b150d85c30da3e312fda460ddae19883018db530e96f38536a346f700f52d9f833d40d0292a178a95f4a3675a8a0130a17ac99669cd037bbf9794b108de123a0262a3a9df0532dfbb625dc04593aaadc82eb78fe8d062ecf1cf00c1504e957506c9d00d6ae9e67cc23890f52d6c16e5081f24b849ac62d2230276b2d1e623b960d938618f08c8998d7d986d9bb26cdec89f335ea09f8f349d04f63e069d63e1f6b05ddc13a4d9f0276dcc44ef17980dc635ce1e715910d7cc6270dbb086e16ac070d3beaaa94bc63cb7715588af706febc4da0d0c93b681c3351818f7674252ecb38a25c9a712eda88d3a7a9266c4a6f4dea84ad8ffa231e78d75b7b8add68e3f99da9db3ddac5966805e269507f8d2f921b05712a72b9088a4d0bf47aa7aa45528de71dec2e0359834ebef63e887406bc7748145ff12209c635f449389d2fd7391ff8f031bd118a3af91410dfbc844ffbb38e18327c712822ceb85919bc2c719b22917a610d0d6264970d73ce63ddfd3ac6e26933f1eee7f9d0791772bd0c31704eb42" + }, + { + "sharedSecret": "a6519e98832a0b179f62123b3567c106db99ee37bef036e783263602f3488fae", + "encryptedMessage": "e7aca8bf4139f65f977604e3f4a593f2cb031f7b9a711107e6c19691d0c5060a375d0d39d6920d2e08d72d59cee7827bccbacd62aeaee61e9e59a630c4c77cf383cb37b07413aa4de2f2fbf5b40ae40a91a8f4c6d74aeacef1bb1be4ecbc26ec2c824d2bc45db4b9098e732a769788f1cff3f5b41b0d25c132d40dc5ad045ef0043b15332ca3c5a09de2cdb17455a0f82a8f20da08346282823dab062cdbd2111e238528141d69de13de6d83994fbc711e3e269df63a12d3a4177c5c149150eb4dc2f589cd8acabcddba14dec3b0dada12d663b36176cd3c257c5460bab93981ad99f58660efa9b31d7e63b39915329695b3fa60e0a3bdb93e7e29a54ca6a8f360d3848866198f9c3da3ba958e7730847fe1e6478ce8597848d3412b4ae48b06e05ba9a104e648f6eaf183226b5f63ed2e68f77f7e38711b393766a6fab7921b03eb2a6bddfc370eb45c1699c856969e2d574fdd155945ed727fdf2aec4f056a4d49fdefc3abafe41c365a5bd14fd486d6b5e2f24199319e7813e02e798877ffe31a70ae2398d9e31b9e3727e6c1a3c0d995c67d37bb6e72e9660aaaa9232670f382add2edd468927e3303b6142672546997fe105583e7c5a3c4c2b599731308b5416e6c9a3f3ba55b181ad0439d3535356108b059f2cb8742eed7a58d4eba9fe79eaa77c34b12aff1abdaea93197aabd0e74cb271269ca464b3b06aef1d6573df5e1224179616036b368677f26479376681b772d3760e871d99efd34cca5cd6beca95190d967da820b21e5bec60082ea46d776b0517488c84f26d12873912d1f68fafd67bcf4c298e43cfa754959780682a2db0f75f95f0598c0d04fd014c50e4beb86a9e37d95f2bba7e5065ae052dc306555bca203d104c44a538b438c9762de299e1c4ad30d5b4a6460a76484661fc907682af202cd69b9a4473813b2fdc1142f1403a49b7e69a650b7cde9ff133997dcc6d43f049ecac5fce097a21e2bce49c810346426585e3a5a18569b4cddd5ff6bdec66d0b69fcbc5ab3b137b34cc8aefb8b850a764df0e685c81c326611d901c392a519866e132bbb73234f6a358ba284fbafb21aa3605cacbaf9d0c901390a98b7a7dac9d4f0b405f7291c88b2ff45874241c90ac6c5fc895a440453c344d3a365cb929f9c91b9e39cb98b142444aae03a6ae8284c77eb04b0a163813d4c21883df3c0f398f47bf127b5525f222107a2d8fe55289f0cfd3f4bbad6c5387b0594ef8a966afc9e804ccaf75fe39f35c6446f7ee076d433f2f8a44dba1515acc78e589fa8c71b0a006fe14feebd51d0e0aa4e51110d16759eee86192eee90b34432130f387e0ccd2ee71023f1f641cddb571c690107e08f592039fe36d81336a421e89378f351e633932a2f5f697d25b620ffb8e84bb6478e9bd229bf3b164b48d754ae97bd23f319e3c56b3bcdaaeb3bd7fc0369b609e1970c91ffda6af9926467f10b99bb97cca2154c464eddb54c54e3f099baea97dcdfa0a0836de9a5b764cbbf397ef3f7bf3b9b5e040ef05e8e18d5903a7def13f4ea94b38ed64b5aefdc94bc022165571fe00abb52ebc4163e0f8efc206c379f7b32fceae158063177613c892fe6a664cf0a0977f2d4238d4d68dcd2790ca88bfea6bcdb62eac3a824707449f32e474e88da9cd3639d4d243f216b09406fba410ee0d957ad0e00cf699aafcb7d9be2975355280f6b103cbb5c919cb0b2c792fd168be7b8a4a843012e184d1cd8e48fd544f984e51f8cdfe89005e8e0247d858740ad0641877cb00a06545a3699830035acbf1e29aef6849dbe7c12968c0293c33ac6dfd3b30c97a488b6c6cdeb592d21528144b0e0bc963a312a3ed3c61a77e7a71683194cd42eac82d057397fb53bcad1ec51911011d161a48c22808a8c6c6da39f3084656d744154b7e22e64037437190e5fbd62982d1075e19afbd04d61f5bae0f6973654fc50d0a4de00f15d8849dc50f8927418e41800532680cea4138ada59af815c308989c7bbc622d8ec7cfb95e8b35923932e0515b37f36658c71060b378c87a881878bcae48f9cfdda11dd841f4a62f35bb5089005484637d682e337f45ec1cfa8ed36ed4410c2e462e78ee6690bbb9001d23db739e6cffd5606981bd06539fa7d3dc5e8b810154c677e18da670d1fb247d8067dae8dc73f2237cd4801f633ada1be5beed9353a9a1489f99f2183ee162d8102f779bf15ff989ba14e67d64e885f8c0f47262c5589b4dcaa2378da5344d6e4fa6b943201edf01506eba88adb498a0b7427571ae81e9eb445bdfc3941f2e9d0e3cd83a5a32aa91f56e9bc53727d30a6b113aad6ecb7be7bd36fb6af926497f33b2a1e455036b0a770da038f708fb233de12385cb5979cb209cc1b69cf31439a5edc83bc6d57a3a51584aa196d03f59d4e1bbea204b4ed8deddebb3bc62bf3c0a6eebc2f7034bec02fb9946dcc8bf9562dd236f2e2c23197737f3f17a3bd03333c07b2e1a344a9676b07726b8e938887943017cefbf23d0635f9e83258027252c999ebfe0a3dc3ee686e0a4891e19c83be61963c038ee3cf258f95ee90357ec4c4e1d837a38ae218a41a23b566d369f529288146660e0a1b2e28eb19cd554254dec5a0d84ee73196641ef116d8add94e6689e73447d4e0494ca2fad032f85cb4c6890b41e345e0085ede5b6e4830d0e31a5aa4401a6957ffd48de1870838e44acc972b944fe33a3f4d9f85433b784c90e3fa3af00fa710bb4dc27f994bdb043ebb3bde991d5300cbcbfa8c6ced85654e0806cd0409ce37cf53927a292fb4a3f2ad7121c33fcc6481b8c20c897055fc804727132191ca178e04acd422523fa7f33d2564683b07a32eaf516b2436dc35b8591476abb5aa197142d50ae8d5a4bf188792c47e77e8848ac0e7ec8e230601420d50283b4099c403e5d49127d7e39124de505b5a3b3c690dc65814cafdd14956facb946c836ed5609d6decf9e5a129e3926e0ede9b5fe352c80ca78d1ec867a2954a640359a7dfc5f25937f6b1b3702c54c27b9352804d3f93ff36f0580a8f9f827b813715f3bac61fe9eb1ce585bcabdcbe044c1ab95830c785ef21b17f2b7c62cc8c1eb27e1e6889a601529a7035a90530fca8d046732358394d568d5d3f1bc6106aebcf464d51b62d32c147bfb35cbf95b003c4290614098f0e93cb868fec12f3d9c92f49b49b737795a9e9d9ecab62a876e1b2ce1ccc0fd038fef9cb8e2a53d30f68a4b4c6df0326f7cc3d87eddf65dde02661d72c6519333063adf3d1ac340f8bb94db63f1bdad0154553278680ddc00bf53d38c4ffadce9b987b926a2c2a29bd93af51ffabd20775594f44f9ac60b59c765c734c2b2062c6a45dfe87204d64134b961395bd0ce1dfcfbe1f8e65ba646143a793e8d3107b79228856c3a4f00bae3d67c80bf69c30900161ccf4c3de5680ecb5c9ab1e70bfe991962f3c3a8101042429177b7323557308161bdbdfcfb8dcc2bafb7bae7c19551e006c0ad01696b3dc6c6c0bab2b9653adfecb23406e2c129d42f8af8efd9f30ae986b438526e82a4bec43463b2490ba0ce2f992b212f455f244ea644130fc6c73f87bce9a817272cf48060e931a15acefcc18399227af4ef02163c83283e72e1618dcb18495b80788252b3023c1cd06b2d1ae5d361ebdabf69b5cd7775fb3b5d37600c0fe5eb8d7964aa34a33a226c31fd14feb2c0c2e94016954e6f7b07a7e735e895b67e131ef142562b579fd52942ace340c4bf9a28fa3643bc83fa0669910a87cef5b8a9dab5084a585b11b3a6914cad9626db5882e8a8bf9c0536b11e1715e4d4488b7569019b14b0a1df4c92b7b41ca70e159f89d0b55b4f675070e30e4909aeb5a3e692edeb11b471a6a2d2801fca0df22ac69f75f0ae3db4bb6cbec21748447f12c6d3437255ef6004ae66cefc8ee61e6653252964ed1f08421050f8d34f6bc6b648df7004a6b869f06ae02622f0c976e6774de474a4b00168b2f2afc12ba98da66f85375d627919b7c5053f9d2eb900e25a49d5e4d7859f43b573332806ac6f2477a8a03179ee0d36a43f51a3e4373e1b38befb7f2b3a17f88077d75d131e74444f39ad3ed0ff3024dc2afc4aaa87f5be3cc71a4f092ec274ec8453cafe05da9f36f35804a85a70138c0f75cdd086ffc5f9fb172e4f19c79e229c9470826ccb7d35408a5842aa526d6a309b82824826725f27e8bce3bf2f9793526befd06de64c2127978297b84d5ba7d5e5dbefaf7e06dbd34caeab7b8e2d75563c4ac6d6a4f6bb3cd9f70b01140d6c918986804bc068ce2f8310670cdb726cb2aaf422982bd5e3c8fc1f8a68bdd3b7894ee2e7d50b4b8ce97ee4e001caeda646c02172efb22b835d40020ac9e006d5e0ac8f0d6033b52ad7a2879e3be1c76fe6b5731fb5a58dddadc36965f1efcd5660bacb6fe4932b573a6fd801244560b2f47f20c845fbc9447cf9425322b90847580d51835990213e6d3cb3d472c4ba53a15b94214735f91547afb6e723ee93c9d4fa90e5ad2aea615172f2139daf01b27d774166ea9919b91d612f3c462c4f23df1a33a1cc6360edcc9a4d001fa8696d47ad68e376e9ce720ecce10ff82ea2866e65f8bae3b1295d1b90f5dbd80ad82e1707700b432a1860e370fde3a595631cb5f6a28ee4199f189e344202606bd511b05672dbd895f146682d163804576a6a8bfcb4dd0795838f75e78bf83b519e4827afa73f0c49fa231339468f4e84c875295f39c6497b4fff9327f1ad05ad7a1f943739d2e952fd10edc47532f20dac1949becbb15e956bd8954a90f901d3ad4288704d78952bc87d24292437a10d3223185c4bd5c0e2cd1fd2422d633c41c908587e606585f32d634c3e179e51dbab02f5f0f4b8658227c26103981facbb373db7b353910b92b778b942453776210cf1fa6c8c59ba2a748858af92e8cfc953f0fb45012a4734dc8e969afdf7781f3fef1025d66d33df8f2091faa2cfe21679fc97e0ab08a3d6c421643bda844e880fd9406300e36141d4a83db27f980e4faceb85d0ea5fc54cbc0f35a3ae9171a6ff7427da60c2982e65a13cc2e57861659ffd51ec7e70d10f4e7f0aba71edf2bbd496d645a61114c2600d6a801864a3e8d6ee82d22d9c3f4240ef029853e08c57bfb66da37b92aa62d4540a778a6655272479a69f2ebdad49a57b75d53bfbaf818e73aa8d7c4957687da9bc046c3cdb7b3b6c9066c7d8d992edd7c4bde417806ce0a1a76400f5744a8365058b2366a999bb3b0a24e208016e1dcdbe2c492a63da7f0d114ccd811ede1f21d980f970cdb0c79ccef2cdbb3c95344fc11903a9a15f88d688ececcddd030f0ecc488e1f557b2937231ac23e5b4ab801e24670696f5cbed80a2783a2fb496f25e28f34086863c9001b25b3c6a0f97310070438270169714c66d6d7fc3cf0a64f68cca5562119338a2ad395d9f8ecbefff42a9fc4e86f13f7b6b565017a765a42b442bebbcb170fd16fcc5a8c280bd803c0b1a8e14b563569d59a47f64d1d5ea51e79aaff037e3e0ea59574c6f6a865e06b961c34be0ffffd25f36cfedc6854a83466c9f03eff021bf9b51e0a19e4bad61b1a40624196c7d4dbf652f817b2a3272e1a302b2413b8d57ab99e1e8f9bf788999ece3e66e9ed8847e4bbb39e88d96b617bb6ec578f380a8a198903e2e97967b64b15b81229f3d230fec2fd80c0fc830fa8eea9399627ad2cd8a0bd5dd53bb21b6deebee24626e9d34075843b453261141524febaf8f3c1fe02ee7c96f3c5cfee63d1248295d0f00145aafb6d945edaa5be71c99450f786b592bb04655ac5f93ac37e6977244d8596bc1fef3d2d0e7ded242b6690076abfbdc6b17b3ee456be0a6337f1c167f8203732ad21ed7ab2ee2257c418eb91ff421f4750bc0c4e78c74e7a6d1f0606dd987921b787715d8eb410921d5d4bd529def4572c7bc3e91069513251cb0fa2505b4bd1f88416c02bcf7dbaa56d148c878044e71c2fe230308bb36c9f2454b78b966c58f380d68f9289bf84232514f3c727e17300fe032dbccdbbda5810f72f7b9b1b80bd5feba8d3c8f45e314139d4f004450b131150aaf450c1452d97de476403d57bc10b3efe61fabdfa95b487158a3693fa30cfb0d9086ac597075a40c892b05ff1267b85d5fddea9e57e92005445fd50175a97dc5235288069ae938aece2db978fbe03f22c769ad06cca8fad8dcf3cd95d39c186f2f05d429934f31ef3056365c97ab88882192467b43071dbb7fd2d188a60df04d68fb91c03562f3f13b6dec89e6a71555038d07fa30ef825eb8cd251b0d1a7225d61de4d3a4e0c6377fcd46d8c62916004e377de3c16ff6007a452131b0f484df1679ace0e1de07a9eefad8cd2a0881417e221b21a6419cce06e5a9a5a9be7c79eba75a1c2cf01deb72ee76b2190516ccaa6caca7a57129268be869885e3fd025d035efaebf6431f1f33459c191dda66a35b8b72dfeb8367e87682e16e9dc4bb14407f913ce2c27a149ff717756d7dfe5511e3e14ac77c625b36f7c3658fccd896b0e579f526d001f6eb284765cd4237bdce6027f413772f8a611810d18c377248c220ec99e8cdb7ae020c40e9d970752d8bfd3d4645e5b75dd3f067f698e7341c1e859d4383a6347aa4c4cdc11753ac5a088f5998c118daedbff6be7887911de0e3e176c4c0feb1a461a003f839e8fcf42f7e116328ef02a6dfde52163d14114dde438c16b75b4fa5cb2c09e01c0662dc22b4e2e51c2206933deea8e89f7104827f8916129a033a0709c8688756c03367e7e1711cf461863e20f254d37fc94806048e04280732d3a8960d7ddff8ff2324454cb09c397e7ef5410335a81d7dc8ba44cb04d74f50e0c51c0f006dfd87b1059fae2a4a9d5a41fecdc16bd16643e75a91b54ef88cf66ce4c02a05cc0241c83318e137dc11e2f1e3bcea71690b541b086845047d1837bcab3ac0c92b5cf01cf98d506b519d2065164f2e5ac08f71e6d27a81801e0cc4f7d3a0f8ea40d4a1a0b428eaf3ce78f9e7ded31545931d01c2ee67ef8682686f2926992d00d13796c7e608b7821b7f94e70531719224f6c58d1ced60eb2fabf055bfd5f802533e58b82e146237596207eca421c05b8e7adcdc2c8ee01017fe72ac99d81f774ec97d9d6209c5268fa5abb6d99ee9672e5a361dba023e13783b8d509764533a34291a273116bd695fa22b30ac748e904c4591f640e3780ef063b30e071c048c8b41f03965642fef2cd310662c9924a2bd4d9792035f6f5fb7998abf00c3a6fbfd352bd1a967ca5a9905435d35d4de0c55e9813e9d34ba24eddf5ed059468ece513d17fe39f45c22120c9f9aa4f3a1fc2e659c2827db411ccb1244b205700558d89de4a87441fdb80e77e7c725443384519408d0eafb4e789d20524377720f6384bdc93633cc3a633b187ccf6512f96fe27a67d14ed5ecd8c73a739179dea157aa601a9f68d36d031b6f23a6cbfe2dd80fc7d51def94a55e1592d3512034892c1b4c4146f8464e1f6616bcbdb43c0c4fee0235109e31960e69459972a727db158ccf85a572880bf10c6a034d67c34cbcb0081a1ce368b1686f5967ddbbec7df93f39ebf5d3ad1b9e8eb42ae3dfab663c62aea3a4ef384207bfa1956b369c10b8b5fcb5d007c2e7ac2b6ed4d60e323399efd6e48d2086d2399e1789d49e7580cbe167a0be3b7fbd6fcfa6a2122dcd327ae7c33cb22d5326992b1336303651ea3b3004a74b8aa168046f94232cfab08a618613cc3215f2dfff680bde8c4460b99e28187752e2c82d8cdeed5d522440bffcb51c5cf6415d79995e25c92c208c2a3e6ef5ffdbe4cf0e40951669cca70cd611905b6c3446095b2b602fa1e4d5169ab307a629d918434f703c6199f2468a1c97e71df09cf6d704f1238e715f470ff11f4c03060d56208337a9a64172127d17a439c958e611d0d2bca4062e857bc00a703312845e91b9c939940972b572d8852003811ca01f7956c51fa352b02608355daa19b4fc123eac610b3592c9625f31b22a10bf3cb8a5b6d7716f555d10d1d6098f3d9d919158f735d5e6b1829ab7218b3416bb7c0ca4f8f5aab38fa44bea3ea4133fba90bce8cfaa6dc3c09db114ef8565042bb044fb3563a1bb9441c2d822fdc1c9948c434a037e4879cfe09ff047f6298bc364888948563ad034f24fe84b19b2aefec4fc97de5e0d94694affc3f400c43394119a07306cb6240a2555738e33d9fe862856ad6a3a41fbb26379de05b79321e0665c189fc6f47e5d535fbfd86d73c66cbe2c4167a2088018e62464d02a4d3c533af942c35bfed8b2ca6d84ab743c4b63cdc094f6b51e3c7e53b5eb3bde3cf8e9444a1f6d7fc1412a12ad88b0919ba02f4899832cc94f178f5a9242d31f33d6b0c16a905081d9edae79853eb4796f8f0775daf6ed9c01b6291bc96171ad56bac7a5ff518e10a7d8100b82d0283d980ab0ccb8847d6696b8df606c5b686d18066b8523b56c62003a6b81963f284c6dc9abb5258e2d496b3747f623b36e97f92cdd72ae8d59d86c5800d36952dff856ee63bddcd0363cf82ad6ac93f4d42bc59e923d6923b7fe78e749f830a59077cef7aa026d56150b39835e5c87c50ddcfd63358e05b32bdae99fd3809539d81385db105fb18aa11e247b76707820e8fc4fb8352473452c1e6f4602ae49e9f2dcebb29e7e9c9bef8042aa7b8af45fd573febe52b0d6423cb0abc0856de139e0bfe15a53738404be519dd05861a8dfd98dceabc25bb5955300bbad42ca842e1c4a3cb17ddde082138da80e1143d783fd7e34567b2bbd6d5026d0dc08ae13b1e90662df583d92fe6f7523ac3d549a864495d145a86aa4d52f05ce4bacfab03709408fba688aff821121954393a38dbfa36dd275a98ff0b85f02f8b7215d0df4f01f3e740902314dcdd0c77e5110bd20351b5edd384dd53f43e34f5c5901e4d2f9c66b068c989aa0067a9daa3d991b4a994202061e871666ca5739ba50c259d822fc9b5d8789c04b485efb789fefb5ed53ef7ed5da3bd5eefa77a230d86f034921dfea9419066cfc7aadb5249083321915ee736b331f21c8bf9dd7c8d9fb0f9a3b9dd7f02b02ead5590b69c98850dfa5b9a8ff192cdad990959c7fd74bf4012c8bc80011a9d4fe072c6a0e5c078a0d755edc5aa69093f014f16ab789f89aa130f3a8b4964bda83e468c9ef25089cae52172e0eb6eebc64d377de1193b4509cfa1bae6ca72d037ae0a26521dfecf6c36df053d634a504ca371ca4e0431a5db9491c52e77fe87c30080eb791a51f6ab3025f1e7b3b04c6df9d31f9b63e0b23403e070ef4919215a89447fffe975024a43a888d6e19d8485fff78eea6f052b98cf93bb757e087d6bba8190e30f36dcce0238d41e1c6baad9993aadf0bef321c13a7439272fe9298214e5441978fa932c03a483957cfb61f00ed5011f42b2119070efc31fb66d286fabc240e51389fc8d7a78f384652b396f1f7cc05bb92889fceb0b1583bb4ffff7d9116d246e9a0023846f5b1da0678ee4a04c685ba4b192d17c5e719f1544b59c42ecea01254bcafe89f2e39731239b7f80f3f889eeba5c8b1a85b9580d40f09921cf90648c6d6aa2c6d4b839565105daa6aa904e5cd2121e9fd3dfc204d77ff3c2ed2ebf6e6fc844eee6783c35683f2ded3e49b60bf2ea8717c8ee45694cb6601f551f387b9c1c5035d6c03aeba220bbadd6168174f7efae4bf363a9a25387469339ebc2536c24af1dd02019aaad1d05994e13a2038268dddee84d0dc8854c61f5a5905442df8a417e43b6d47c8e657cf47d11d5720d7f2ba5c98421ddd9b6e5ef614cebbec8b1bba13f3dd29bf7a5a46029c06d72518a865c7a7417c73074db07f27cb20be4e93f92d4949e02e54dac0182d11ac383a9ed5f092de485e4dfe0a2cf7ccf6c5a7d2230ff5190bd794d631e4ac364d7dfa78836a7e33b3cef58cf3e3cdbdcda75474556464dd137d61d1fd77f830a3ce20e0a08ed57998b28350fc5175922578b1b0aaf851cee1aefcd16f0bf2373f7b2da469d954de07f30b8e704fa52a4b8c1b23ed4a502f2683048b8cd8c5d9a0c5ca764eb84605e294425dfccc68f9eb84a98089cefc85a7a817a73a294c96692a8ccc8c33f72520c54407825005a0d43eeff6a9995ac16e19274481846b41f6edf0e05cf2f5228b33f738112b69ccae3cfdb1abc0bcae5d6e5e512c1b911c283258d4f606b3d27d93e27c736f16e76801a2312cd718d63150e5334307aaa374c8475437dec335f002d62aab917f51e57544905464563fe5bfdc708334896c2925072f45f5d9573d103893f99e10c193072a182157e1989a44a11c66a5a97caa41ac7eecaaedb10b57bad412c45777a64b26bdb232ef42f79e19b3b893d5ad2e67c5bcdeb535dc29347f09a344becd821e09a183c8ca2f566b164f879cb1143e26854515c082904315ce727fe02d568a7878d00ea1573ec6a8cba14c94cb23bf598b4ad0f79a4657c1e70f06789b276ebb6f8d9966a6a9c150af2ee9c702bbbc6f2412886ec202fd1b91a35e86e45bc59774be38ac4bccb0e6f21f862421f9097570520a10629923d17c4f75e6deb27f7ffb6d22aa102bed0fc3e77007a2f7df6947cafca8a264322bcb2d71b7ae38fa9ade94547ca66f931601b71f541b781db8d17ca3f3125aa8c2b942bf4958ae1c199bbe3156d15d769773c886e8197add8b1592d97081a370e0c16b0094170fc3c1e05bec43adc134492f46699200e8aa7cddbf5df74e20c167ec530eae65007cc33516a8c16ca437c6d3f30087c2aea8684a60f341d9518912c24495d4c8df8e34a6db71c810f966660822dbb97cfd3622a6a2ed274ef9b70ca40ba73359c2139c660afab05d08b22a6e16c657ee21d45ed37ce4024fbc1b382e6522038ae9c7776fb04bf00764ff92fd5450829e0454d8d64f428cf0754db088b51d7c8183e12da455f009156c34b7b14526bb704cee33dd8b026a12401175467f98af09129b32515baa0494b00908c690f112695b5e9742d139756eb5079efe20ab251178b982f1d0152b613c01fe8c3dad0a6627e892732bbcbfa476901aedd0d0616f160d2909ae60b1268e70935eb60e37342b10c05dab55f1a5135cae3a3d935928f3ef13b8a0fb1f92ccfafd81640ebb9a7a900f58499bff6573c51d0999cd82abd33c6373359bab604fdfdaf81556e64d15627b0bb80686e3a9247fb1f9419ebb445bb17c3fd170d54a1fba6309e053c4e73db5e619fba7294bea1de1d4d075635f23c06428cd714b533a70b4bafbfcb82b847f61a2aaa75353ea5512e35f60022ed6b50d41c0287d8af3eca86353213c819eca5f0a6f242b8fe1dc16937abd4c304af261a53c8fa1f786f7a84fab2a75cf9c13a47b2f52f8d1270e78da77a4ae8722b836656e44eb15931b6fb7e94af8229c4cc417d9b1aa3c67f2c43f6d48fd134b68ae9b79cec417cb81fe5d095269df1a84aef9890b3620f71a941eaa8010036f9d175a4ad29678dd124165b974e31413662be15fcae1ddf8ca4abdcb3c3e062ab3ee03da0d935e3d43b8af5ad10755230a2e0130ca6425123f264155a4ea70cf858ca20896e45d62a39c1dd9a45d84b06cd251a18640093fec2ac2ace7d95c735cf6fd31d801042aa3bd1ede1c545e83593ca2c1fc86fe74adf8751bf948d254e02cb1bba18b58a4f4c62a72914ea2610af5efb9846fa3f17eaff8453716f2ba2cc99f3e03984029ec93e4299ab9292708487c8dc4d4bceb6c6c1b28e90346506898d72f5d3c75178bd0afaf36ca5b91cd0d258feff7ef890c927fbedda5951a56d2e46c0309f86f09b4df36c93c9134e53a1fa284ed7844fe9b2c4625272f56168ac97b07748bb29be0071f52052426a0af72ad4293dd4addd8f9c2970a19beabfead98d4ff057dd3d4cb794e0a70424d4c35d5ef94f3729a57803c56c9252c0e7a0c77d8195888ce1eda9469a2bc355294b46ed4433f7dff864a42fb792c021c077b358b9f4e20656db45b4d23d11abf1f8c81775aa2794bfee69e39793a0155ea700a88e87172c4258896fc427a0a5555eec975a67d2d02abe621501e263e37c64e6a241012d40e721b57c96b9d8608a441055ba3507b0ebaabc8be83cf11391ed229fe7a0fd5af1051f1f822e8d014a2c96d99299af66ee63d26575bef020901f0695fa5289df98dd8466cb74b047fd0a05461ae99c92ee7281890ac2f535277123899b6f2b9c97b71b65b6263fc0a63c59239ea150f7ee47a5fc2873e01be82a1c7e3ccdafc9242af1dad409f5f7aedf3a516c833b80dda083eeb92d35407a217dafde5b1a8926fc19c0c1cfacf20348e8286e2971de78b85495c0b921452de5e21e6bcf5f7af9995177f02a2bd1e9804b0f2c656d01974ccd781f40fff839a9458af6e5e02264226b370d8d8ff5fe3f31739ba88bb3b8393020f5fcb10ec076aea2c4816c2f12c2beda5367e3892913bda6d88494a87e45b411578c9c089a02c155d75636954b390fe22ff5b620e53ac0ca70fa21cb6bc39e64e7bf128b33196b147ec010c270478ac57afd3391042a577b1612a37f1acf40a7592f4794ad6940df24a6c740362a0b4db517feac379c81b6115364dfa42a7522cdd9c4ff2cd7ce939c439f80452b369a3fe156e0be72bdebea08e63700cdb46fc4cf05a9108e24dba4864f37a54cbc6272e31a3a4780bcc419b2bfa9f440e3abb462e0f9db5dc44904a8b46a99656464ca3ea9ff528b2a3be100132e94bb0247e5a2055f3b24468d76591290c5374d93ada3676429e85cd6e4c074d1ab1424ef2443832e8f00d63eee473b602a9103815c90ebe96aca38e79c941636bd21a1c697f1eb2673df0e3b6b02cfec30e367822fba39f0d643a4dabcfda83b2c528249f48470e714ff45a8682abde8939ff01872b86489b713e25cd62a582545f2685fe98b9f5e5ef0f46ad5a051c4fda59e1863efcdf0de7173bf778a23bf305fe39edb8c9462de60a0270dc7e7e3f8792c05b7e744d9cc167608f69881fee2985a6d3179adfe87a3894ee3223bf69e0eb13050163e047234562b7d57eaab10e1dc905277d861b058112b02098f4e5c6f650c6852a46c9e3f36e3fea2e5d60059628653badf26b932d6962b9db22690cf8ad4f38e77e0ec85040ae68079b4b305246538d8d56457f01efa79b298f9e6eec5836e5889d83af25e8d4c93e0f30411c5a26dc4315662574b39396d5c6e2e51ccf17550bfae8be70c0b130d50d2c17dc984405b20e6a3131fe9cd26cd6e6f6aa53e31711f964967ad1663b98cebda3b9384b950402ec3ee755139c371f135053fcdd42eeded37b0f8e630394aed030d3413bfe0aae3d8d79a3c4f0283dff86d70a87f89dc5331f06ae71c3579d2e8825280dd4635c9a3857e02fb37d3dde2108a74e864cf0fd8703005336f3b0738680e34d2f840f13f21fd8374366d4d587b9be34efbec0710524e9095c48437a8d9d0c9678bcae7351662a48fa2f6cbaa2d767a70e69f381cabe627a652a15db7473fd9f039cca25dd02596f60d02d462ae87b6ddcde816a40f043c8ee1d47e8d2bc8a897405e9747f5a7f26c02528e18f8aef52117933ec746eaa7ac3abf498a63be1b8a79f00028de14de66f810cdafc06052939a56e740c8d99378694a74df8325fe7389e63bb7a741b8bdfc7b54ba39b4c77c365b62840a38938885bb9f074ac812e9e4fa743e88067d96450a295e9d614df3e834b7565e87b16a0c5cf261b192170f63f61b5527db6e559f030793c0d032e704dbddcaf0ea2953f32dfbed8d95cab73ffd7031f4948954fe708a2de3cf357f60f9e55942007d5df03e526fb5a377659c45b95f605000210d1e0ba5eb48ba8783d5ca3cbccb5b464414f8af008ee4075e580b05b1f428b8e18e5e0541fbd8401d375dd44bd9494654696c437952fc5ce3cec51ec9a6a3cedc46e373348b4c0db1edc1af66c7973d7e6d2a713c04aee11f6dd48247233609547e2d492b08c12f644759dbfa4a5e86e3fca90d9c086d1c1fabd9b77284ee382a383eecfe4e740b6ea0988b689bf751ad9c39244e0f337e24f3830c2490661333b25e984522aaf6bd34b4edda1972a71f14a83eef156c22c4495687bfa1a8dbb0d325500a641b1905ba60dac7b17f0c0156eb1cebcc1d166f6bf139763f2abb186db6fbc3f7ac1d8253e038bd682e5e1d9d2b6d0107f4d48be82bc241a34c2c895660424c563cdde69980484387ec975123eceef3c8aba87ca18c9d1082155a49affab3d6e345e391a61bcbd9b8c5301f119f2e7340bcdeb034bd9c44975fb304f31a02f842e339f285fb4d603319e681963921856daab0ecc5dd515cd475e30a7ca5ab1f0b9e4e144289b57794d64df09c06ec4de950ec027cdeb4c5f4d0d830d105321494fb7f9d5d572d558578a21ec9adec67b9651da978be8e99d138f29c2369ecaa32c75db82e33504081055635267a514ad92fd05aa59fd6f5d2ecf057d6b0506d5a37a58892c53ee0536f7b408483fc19419742f7dbb54102dc38f11f86865f885eada40bb72f9853cf0d79a7883a3be76a71c0f9bfa96f6c0d858ae6311f905fd0008632c02f720a014aa840c81733c90b88396244fa9ca291d9506a56d3c96d20c6a08e0dc7a036e2313d1d597d37c20b4e37c8a4c0d544bd825980d4fb68753ba3bf746a9ff60cae9c321dca19b76325fea1a9c9e9b7fdf87a7cb29f5ebd57538bb7cec8213aa8e3c01bfb37ce7c0c04c3494457495fb99aa07ea90410fe8ebde0e32c3dcf9ad3e1a55ed44ccdfc41a6637f41e2e0f2db37a0228ce67601c2c8f1c20e1b531f561392fd7d17416a016525603aa04ab6a583b799241af4a4b008a2cf9da208f9f6b429778520663132f610c24a82a4a40251cc945b52f3c9d4777f3c4bd593363e6388a1f72d28a602e4a551519f6a433b618cf51c38fdd4743bfe2eb0bc65814442a7d86a62b81187a61a172056ad3f94a74d7b8873f927ac00265d9971d28f2a7668b54584d5c97f5d0afb282625c19fe056776b457b59ebfc837bde15d349f5c05277e03eb2b6b641e0d7438b1b3d0bcd3b3d2b3ea4907b8f88e4d07ce77fe39ba4109a5bd177ed5fe91af08ddd246302ddeb1b002f251ed57ea0f9a0bd0940a115e8c78f7955dfd2a979f044c4d379dce4b3ba386a9634f9accac7b89b74cc622a2645841d7af570de52628cd8d9837ae184794ae224ab5b3782c9a3d16fa66de73f9a4a56a00eb3e58e7b0704069d40152d90741bba21f4905934f92a02d8bc2de9b76933d639337b380bbbd30e6087a4f20bc996a3fd74f730c1ec8a4ef52d905b241b23b1eab79be81f210f54c071608211943959f70f5336e89adf3ba82ac3b5deeaea7a8d7ae12f9ed889a1191a31cdedf5e488d22992976fb5a6d947e8c2fb3ca4feaecced72a637e444e48447dab70702e547d992d2d04657e1796aa9beede94e814c45f49f5c4eded8e5dcd6feb4e2686dbd40dc4c0f395774a86dc1625b4dcdd55cae9479ba2db76d5c8d666135086885c22bc1dea2205bc6403720521f2f702c74fdcfeceb560f0559996bc18ab11f66165768633c079e3c9ac1aeb46f95064dae671fa357c916e15f7259d3055ffe2315dd978bd06bd1fa73677b42f1fca814357807f5a10a37574b851f311f26e84e62d8e403b7ea589ddd26b591cf0c8577dccf9897691a114eade2c761151c84bbfccaac2b16e31c29f36d9298c455fcbcd5ffda0f30380740dbf68c1f210ac8458a2f2a60240a4b41f85a9464924c613462d9aad7525f3fc547d82bfe38a6b6b66467c9c870ed308a4aace436b8b22954dc08066347a73dd3d0fe76cd6a639c2b9d95f343ae65217d4ba7e44d3dacfd74f83299a1d4eecb5e0b78f43246dd6b8ab182d1b84cd9af45c3814e3b84b0019a7089509053b2c873019b92eb928fb856fa1f7ffa9bdbcaef2d3c065afb0ea80d8ff697f2190155b99f636954143bd75291369a76d67b69b7e24e391397ee79597cce90776373c37760400644265021bf2c9604aae88fddeb69fd97cf518c847041cd9bd692e3358213956928abf182fb7bcc84ed3b6fd28f1c92a396f3a80a6a7bc5261227522d7558a723348054c19edad94295d4eacf117c4bdcbd9d6987e5d364d0a43c361cf220e4fd0d08ac49bfe9d641a6716d7cf0cf6a746756229a6584cea998d0fec70fd9b5a2ba771b1f09fba78bd8eb1b3eaa8070e57afb0d583e3613efd566d9bab7ba5d07109dff98789eac29ce3ad53f0017900fda38d509d997313674595c08a1b035b3b40116bd5180352a59bb3dc1400c3848ab4ca1b086891e5fd6e000868523541ecf09aa62cd8835ab4e283571881bfc01636a3c5d7575907c93192603e10a70f8fc88c409fe86ae5eda24271c342a5364b5d1d8e0874c8c58e027b08225e7d1bebcc88cd6ae6ed2e4ab17e7831daa6eb82be014bb186bc1e83e71344a7e2e7a6529c7c3c91f1d2a8735911ffdeb7eafd97d82bb81dcef44a4d974f4d58d7ba923f43d778ba96afbb91c8b3f28a191a91479f6b8066b780f741f30b4d8c3fbac99b506308063acef4c101a2d49db7ba04412ca15df3180d89f90b85158f34f646b10318c0912e098bcfa3c07f1ac907411f716d8e7a92a72ec74af025bfee343eb60f58a72481483aede4bcb5369b712ec3d65a496fa5d4869bf4d2e623701d3dbea85f6b5f0aff5c3a0f755a17c02b22bc95765c3611e2f76abee2bafd4817284904d7c042320a484ebac9d01dafb1c00125237d0d9cb17ccf5023727f1d7ecc82ef51384297e889795c0bc0cc8c0840a9a917cb7f75548d139cd8c2c0369c6062b17a42ff69cd4f19c38c86d04c085c930df0a29ab6f55982be44c30f5ea6b48524a64c252dcee523f2ae8a9e6838a6f4c9f3a924cc914956a5799745e71b614a9a183402bdefc2833cd9720e8125d017af673ab77d738534eb84e8d0066adb7f75de7a170b38eb6ba4ee1cf248e27295ff2ddbd66a597066a8616584a88f018b24d057e0aa54975d1ea2cd251bfefafad0921989b32037da3ca2f7a4462e2b80a01137aa14028e17345776051a03edf84c503a89bfbe98f976f6efe010b05723b869a0a85dce75cfaa4ea9725e6b93420d126ed7b8f10e0792b6c7735c31760c83e8324c90e0c508386567e343c5f71d2c69355027b359a1a67582a9f2db16ade6b0e8f335cfebd65857abb9a138c5fff9f41d588cc7ea4203e2722c37410cae8ab4e1f3fcd8d59abedd24e7d7b6bf2723bd1ca8c5eb293e118654be512bc9c2531e7e395cc1a507878ee6b419d368f6286900aace47ab45e3198d78a8129803983519102d0b65d2b89d351d82880a2ef6a0480a2b0cdce7ac271381bca564f8c92f802a161e4e9329c20eb68af53ea9f70b134d5f27156f3a3db8581e6da5f7ced9d1151683d53b1a73aff8314a782b9d3d31945d52698823b85fcbbfffc93bac3d2746a7e44ba599eef943c1527877760cf4bcb9814511bcb8a187685989a907d319007ac49cd2e4a18f46ef2edd5d0d49c0732ad4ae88d3ed3bcc7e1cbcebb750e0f659a1a34b236c2a22a06b7db142f6b9b047d51f37e53d905bf4cf4f736ce04ad9ea7f2ca47304d30201b692d6a668758f8d7d2e8b9dcd9a9cad008e158bb0ef38741609e343f6b45d7dd94cb40ee59ae4ab7fc321e33b763f3e5f36f01cd27b75866b088e0169bcfc378be605714f954723754cb36fd32b4875fa5ed975d48795f72d60b5005f05467d15c184ade5033da3af4891538c135cf00e5876f3defb8325661d3c572228ef8ea7ae00cc29c86bbc581c8e64c70e8a274356826d1acc9d2f78a765102242d63792ae9e6cc49d340dae77ae9ee654d065a022c3d13f973ed7691556ec2c622a57cd22df02b02ad57b825147e32bc16584dba4b9ec643715809055a3f300ea3c608e0f2880ca9ab8f75d57616fb2b8017914df8517a3a4850fe937625835a7b02a88d76697960d7c8801bd80e542407383b2f755502a96f043cd7a25aacb09aa97b69c6cabacaf0549df5306473b7db264d53a96ca8e9b76560ba4ef87060ae64804358a090e07d525247c9c4da78c72eacdf161ffa5c75c2c6095ba18b70df9c7b38e80e9c9e6891f16fbb5ad6c5292fa65bcce449772055ddc56c46b98b6fcfc2a880fab0577aa114cd24df5142f631ce43374b898846538171360f7fd086deb8f5da7c2cd5a513cb7ef488fedaa260494bb30dba62af778dff9f19aeec3daf68d715269f35b467b51c036ef0a4ab3450fc952a5adf1fd52ca3b373a6c1479f878c1fabbc2e7a887c2735086b5042bcae32ba4436c78d9709dceb3993aed247f245554d8dc7d5ca62a1c39e937ba114ebeab76d4ff93250bb34c56fb9e7569b2d2493d85f3275e9f70ea0358153159bf392d0def0c164adc1c362f9515d7e247ed7e9665e89322672254a3590c0c39314653f1f92c43f35dd7a729338d0dffcae520ff63460fadea2b507b013b349ea31dc327dea285e2092a340185b4514bee5bb735423683d3e2f095759d9ee926ae3d9a30238004026696d1f9557d7087d027ded9fb222c7fdf9d3c318e021748cb57073558fd729a92dcb7588e3ca04578e478f98cab4835d3adf76c74c9d1b1ca0a936c2a814749f3a5708b6be7825e8c10f053ce61c5b9da1f1cadb10ba664605000e694d7c3dd500a5016808d67cff8e45dc18d95a30d7693710179983a0ba565c19544657f7493f17c351e4d57211d22d520b48c716c355ec011a288478f68f76afc40d30fa8d213d33b166002760590dbf212d1d17d619c643b1fb100a1ccd697c2ab6b2aa99fa09dae23cbad7ec390b38a345a38e5b74a5f0f3e1ef206aefe0513f11a25c15a37799213e7f47a914ffcb1f9" + }, + { + "sharedSecret": "53eb63ea8a3fec3b3cd433b85cd62a4b145e1dda09391b348c4e1cd36a03ea66", + "encryptedMessage": "d135558a6bad7c5a617272dfff6fba9a1ee9d5509b697129b42407b020959566ba84011d09efc5e187c148ba548bf7922e7a5d6c0ceb2ff3a559ae244acd9d783c65977765c5d4e00b723d00f12475aafaafff7b31c1be5a589e6e25f8da2959107206dd42bbcb43438129ce6cce2b6b4ae63edc76b876136ca5ea6cd1c6a04ca86eca143d15e53ccdc9e23953e49dc2f87bb11e5238cd6536e57387225b8fff3bf5f3e686fd08458ffe0211b87d64770db9353500af9b122828a006da754cf979738b4374e146ea79dd93656170b89c98c5f2299d6e9c0410c826c721950c780486cd6d5b7130380d7eaff994a8503a8fef3270ce94889fe996da66ed121741987010f785494415ca991b2e8b39ef2df6bde98efd2aec7d251b2772485194c8368451ad49c2354f9d30d95367bde316fec6cbdddc7dc0d25e99d3075e13d3de0822e4d8e15a7c521d67ce2cc836c49118f205c99f18570504504221e337a29e2716fb28671b2bb91e38ef5e18aaf32c6c02f2fb690358872a1ed28166172631a82c2568d23238017188ebbd48944a147f6cdb3690d5f88e51371cb70adf1fa02afe4ed8b581afc8bcc5104922843a55d52acde09bc9d2b71a663e178788280f3c3eae127d21b0b95777976b3eb17be40a702c244d0e5f833ff49dae6403ff44b131e66df8b88e33ab0a58e379f2c34bf5113c66b9ea8241fc7aa2b1fa53cf4ed3cdd91d407730c66fb039ef3a36d4050dde37d34e80bcfe02a48a6b14ae28227b1627b5ad07608a7763a531f2ffc96dff850e8c583461831b19feffc783bc1beab6301f647e9617d14c92c4b1d63f5147ccda56a35df8ca4806b8884c4aa3c3cc6a174fdc2232404822569c01aba686c1df5eecc059ba97e9688c8b16b70f0d24eacfdba15db1c71f72af1b2af85bd168f0b0800483f115eeccd9b02adf03bdd4a88eab03e43ce342877af2b61f9d3d85497cd1c6b96674f3d4f07f635bb26add1e36835e321d70263b1c04234e222124dad30ffb9f2a138e3ef453442df1af7e566890aedee568093aa922dd62db188aa8361c55503f8e2c2e6ba93de744b55c15260f15ec8e69bb01048ca1fa7bbbd26975bde80930a5b95054688a0ea73af0353cc84b997626a987cc06a517e18f91e02908829d4f4efc011b9867bd9bfe04c5f94e4b9261d30cc39982eb7b250f12aee2a4cce0484ff34eebba89bc6e35bd48d3968e4ca2d77527212017e202141900152f2fd8af0ac3aa456aae13276a13b9b9492a9a636e18244654b3245f07b20eb76b8e1cea8c55e5427f08a63a16b0a633af67c8e48ef8e53519041c9138176eb14b8782c6c2ee76146b8490b97978ee73cd0104e12f483be5a4af414404618e9f6633c55dda6f22252cb793d3d16fae4f0e1431434e7acc8fa2c009d4f6e345ade172313d558a4e61b4377e31b8ed4e28f7e3d387988c566f7b19962a9ca0623e108e4ad98cee785a49b02302aaf8691a2c96666b2883eadbcf904a7e98f6f8480d89457414e7c2f9a491de4e1e91d8becbd46d13f716b10a2f68c64c6c55e50e97893ee805123d6ce373e0d8ae791efc410413f8e0379e1c6f83e5c2a8a3dd2adb13f15c7e7f508dd9e949dec89bb6b25e8654c0df89e376950f34f3ba0c9303324e1340a142298a0b9c7773b6352966948ec8e21a82e0a1eee50ac1b22b92c77a37b258a64bb3eac67ffab832c99746982a1308873baefb4ddb0e91651bcd63ea3720d78066f0439f6686a1333e463989ca843cec72a3e9076ed367cf994b6a66b03908a9f02dc6e1631a300cfef9513e815b9ad113d3199fbedede6c2b5afae91ffea69f4dca56edf7069eb60d8bb6b7794b7f14b1667acb033989dc7d2e780b6a2737b7b898d61e02bb1f00c445889e3e17330530bb1fa2247573875d103ab06de6dea20f8466d9634fd8f9fd4cd2a6746b38606f9a032182f99041d239f83c01ea10f36348f1bb7f93ac0d6484fdd157aaf0fc1b67bcc0aac84ce6e43e9bbbb8d80db67e64c9f72b233dfe263708c11f3722c9ae033f5603238cd2ae6e276e62b016eca50a83223a0d2fd8c77c39cc48f7a2e2bebd3e34c82bea6e7ab05b36ce9e344bd3b8e6d863f9fe7ca0c59d8f578365f65aa80fc30594121a841aa7c1f9942b3ab2fb38640b338abb10714debf5bd631c4e74fad6c459c9f1ef63bc177d60ca92b00cc0e39549ecab76cb020044f07e4a9b4586ed65e3a623589d57b04014308860578ad78cced99917c80b7a4d34e3c056c046395cf9f4b1d7843c4debcd70f14ad5b1d8df5578521ef7d2a3bf7e6d92aee9754f9613c992a4db9770c1d7bd247c7593aa2e62e558a856966667e125970cdee386ce3809a124a67566470a56eeaa13c6d8819fc58d60c1ea52bb92aaefe0014ba41375d8368a0c75791bb9bbfb47468d79f1c0af2ea460776052e0c3300abbefe917fe32d1ae4a123480f0886d0a9abe17865cfa213989bb368dcac13ccbe3914e91251f313dce457c555b4f124bb85eaab778f4fc0e065d30cfa27c700c091278c5bf5be65b8c0d8b93761271d1a043817b9e06a246b55849c8d9c2487a705544303f7b6d5536bcf213b131c0bb1fbd094f6c0b1c4c87c9f8572c723a961cd98d07c3ed4e4ae6acfc8d87c38be39d5c268bb03e6a4e1d9b11dceeb98d710dd8678ccdf956e8b9255f3ebda5b0a5cd192dfcfccd15176ae918dc422a20519dd477f4f725e90c010289693fd12e39c62264eded1a2a633ad458ca64cac573edcdef709df0c0f13dfdf06d3fb5bdb0dbe4b058740b3a449b8405f1e738640b8e10dd8fc9045eaa1017704000af84d18835e134635603c6fe3562dd3d19104297ee3bfaa47c010440f376c260a7c45297084406980fec7b5b00bd464d247578696e45659ce2fbd561c4319f44575b0de3036c6eb85250eeebf942c3ae284742edac6422d31f56f1fb3cc1de111ed7569bd8a0034bc611700b6e43fc11681125686657948c9126ff6e90b6dd1e85905a189bc40dfef8a4a344ac7b12581bd4a26ba3cc9d6986f23df54142c30d803064b22a67fe7de9abcf64895c0dccc0d4f950fa5c40ef645ebe0917c9daca95ec4b5ac17a7ce6b324eeaa6ac1e16b3f921c48f526d9c1151c94f459d1e2be48d4affce815ab9a1a25d7f977b17726957edde1ea0a00d1658fa2a52c9c95c43a65f352b745ae2d99c605327a3d7f51b358cff9d6ecce9f16c75a75b8caf2a272099f514fc1c175181c1de10f12952a727a9509629b684bc39b1a2b6e9459568b692c82af2d8207989cbb924a563b3e6ef36a7f37b2bbd9f2f97469677e2f42d24ebe8029d8ed476616bd1791a3234a2b3a988f91957b585d380e9100c61016e38a0fc6c80bd26183d681d5b02d7b4f7177af368f70989d9921977e9c4ed9ef88b276ceea304085adecae0b2e2ce7ff6a1d5ee14d4463ded2d40185f2081dc21cd0ab90ce625a32dfd57e85bc2c731956ee2b955575514f327795218b8919c9e0ac3d69fbb697be7f76c6886fa361414498413bd857e3c7372d7f1f215d0900e804ff66de7f9021f1a2434cc892f9da433b9ce63686aad06039cb03d2287c71b5b53d7d811a3e3df1c0e7ab4e59116639815a489f52661c12bc2fc8d3e2a6f4684870d0555857c1aed38d5f7ac002cce66d80ed1cecdc2dd1aab178bdbab72e0fdc81d25cac91932a2eb81d1cdead9db81d91c807cba956dfa5e94e80ce69fcdafdbcccfa0d6cadab85bb694978f3d6a66459d0df819a63661ab7ead00692847b5faac29bc75054c47f305c5fde6b41b6735b6d406779ed81f661791c8443ed8b3562777d007462d1e88589f677ba91e69a4ac82c89d76a365a83c80fc5de3cb7291d605e2ccc7c58787c7e870b039ced72d61f0d212495b0d38dee7b63189ab2cd28faace89114148e7d76b836f8c3ab8dcc569707df81108280b72c91a2b54d71774d0107c2ce86fb65d0e3ecbbb406e13e85b6d5f873d6be0fa84508099aae293b5c851a1b708b9d30c1bb6ed6275553d74b7b3873e6ac7f8fc5c92a60335f9dd2a9dd6ccd3c42c2a5861ff3e1773de1d696befe67a6eb99a4211f0efa62a67e61ffc3ae9db07affa550f2fd8bb49a014279d0be6a527814643b42f607cf0972fb39e94060a02230878d3568af1f1665d499fd0861ac0f21a8545d3389fc63955b670de2a14cccc2bb60c68e19c45d8e4c301043559cc628e4fa4d0539d576858a678d4f8c45d86549a057cef9b023d630eec1be49c570f09dc3959bde2bc6fb4663b8e30ed8f1f3d4893995ead1175559b700842e400a3a9e104f936d89199081624fababc74ef540c4872ecbd5f68c00d4f5598919f981db63898884c22e9cfa484d5300f78eb827922857ecf52b1a537281741e14c6470d19afc30eeb78c5fd8ab30a8549f373fda9441d28beccd85844492d1ae12fc3b8f62ae4d98373e229d6a7840c5560dd97afa248aa7884687d69406ddcc220b256052a4c95d8fad82ce54107be05499312c4c352a3176e2098d37150d4ec681ef26329bf4d2e1286e893122c58d0cd92fb59a4afda176f5063c669fa94f0b26dc65200bbb346136a3e5e22f292d65d09ce5d795363f6ffcf38e66f2b4e0479a71b2292d8d100573bd66ee69a17a5fc01358c1b25b1024179b5af14d97c6b4f1774a1e2ecac35533dd66a14e83a5037564fbdd2cf994891d71c901c98de8cc78e862a00b32e2dcfa683198a5ccaed34d99570d9633306cd8c9b51275e00b7bf2eff420ad8b2546b5ed6cb0db2da7fd13498bad31bb3ee16bbfc8e6ee10383fdc8385d56ff2b2dcf814e21dc7cf69a03ed8c1db14cd8889c8f2bf817409963dcdd15341be66f7a610ba3e25677df5713d5207d4d79fda097ff9f71da9427fc48b8dc46550b4d07e0a5e4b80163e23d41620cf2ca6ca1180ff4a902bd27fb9a0fb784815b181761d26f42af9c062e2a0def1a851b5e1419cbd405b9822b4eaee30ffc470fa387ac7f40c447e266a5192c38099ede3cd888c13a2bbc9cad5cb5d7abaed81ef2476a91e63fb509c80d0f4a4396525276511a9742af3d2a3652a2a1bea11b1aa550af74d510aeb9560ce5dcc6c2fd43ef1782ae888a6ec99a0440b69848a17d7bd189061783f133d2a35d18b14865956a6d93033ab8abce41e8e6ba4cd7a69c569386d63f792746f182c6932dfc0c387121d62b4e6d75142ed26621a1bfb1c8dc1fae45db458462100d41ac6d5c40057bf810181c5107456d590fa08dd973645aeeb6532d1da88c634121da35931951ed3167c1e0b34dd9e811452f5a428b94f42ce0ac4aa86b4c6b62c3837f3c2a4f611a50e12cc0f10e86a1fec6dbcaa179937000aa3634e7d14967a531ef1214d2392f39936fa4761c0333adfbafbd7e05d2ca8005d9f60208a588c3b69d329400e4fe66884b2f0765c4fa8b65fb681cf1b6fc339dcfe86db0713e408f89b0a253514b955a9f15e6358b304a4e81551fae88fb6f60fa9d2acbb85c2a18a577e8ec6f19ba2a459393c9d33f3669acc9ba26413bf54f03f79ac26eed7789a6f22d613a9519163349e46a158e2cda9021368fada2bdc3acb35e1acc0e17a39c8fd2ae7e273d6233b6487a7d4fc74b8ec4cef4af319d81fc1067a32731530df733d239935e3271d9cb73a24c8886d88f338181ebed564a1e5401f90a2d4c417dce2d3657c1e6593cc87fb0faa95945761858568b7bfc898130268881470dbfb475ad0619de1a040a0e16f777b89bb17f14dd6ae672c9db6f7f92ec040a041734ac9d283690895d5f55e80fa31748b7c58c74c216bc4fa980ea325bf0244fdcaf8f880cd9db66178ac7b462379ae9115bed01cbd2d9d4eb669056ecb1c9edb1b6afcef241746ce3ff4f6af99eb17995093e65eb9d831ff823ccd09e3a594f63247511634c42ce41c9093e3a36b06e373909653f8182f658faa4fda084e283b2a03da6b1b5dc481a0f3124ffbf8b97178f87f6099e9ec8ef4b176244be790c844eb6dee8148804edc48ca59325b381cf714fc353421b0d7a4e0d5879455943f9ff121c8f63b0b85792a3766cbf5b21061be039d2eb078918b74f1528804f596a8fce2bffa375c19bade1c81d1ce2894af7dfebfd507263a086597f2c9f280e18b07f3245753cfb61b97fe91f946675c5ccc8a7c425afed590a1d7e2be72adaab25330d2b660ff25a40bf06c7148b16c1ae72339d5b66b41817c008d6c501b494fa8bbd2da898f3e3490aeeb12923358c9512ce6741136530bd90afcd6410912bd2ccee6c454040eca80fdf66c134a6ac2759680e2b650c3f7c38aa810e4e9b68c93aa35eb3f24cca302ea6c04d1dc0cc072f9b277f94bbc4757d0cf9a57d288d5bf3b0330be321878a4b458d9184feb9abc035b78953625b382718a88918b4d2f9cca9a1ad17a1fa4b1a85397644dceffad39ff16fea8c616cc5ee0d0f5f1e7e9d9862d56357b31d9777530d4f969b639454d1650951cc8494e86c6b739eb84c1c600e5e7eebf5bc94e474ea0be3c3ad3324ba05088753740dd1afe1e02402031ee591ce12acfe25d32bd8ba12c8995df371ee137518c07b0a61af2012b4cc4473986a23967eedd991c100075281940a7141cfc2d015ceef8b7a38db73219325a11895b8e1e490b0b8d5a6b243afa09180d7a9fe8844efd7e8fdb6109ceed38f8a5842d1cb180f8519d7c9e2868f5b9d90d3f4c8cd91184b2b04c2660e2be27cbbb93bee0bafd7722abbd68e332092253e3aa4042c7f668cc945145f92bef693c2bd54a87a1b21fb25eb446849708063a263c2d3ccc343c3e62deb18992b008e79ec51b7059d3b55b37a4a4a337c8caf832a444ac940b6e0c3eed93ad5218c2411112c17fadb7e0ab8bcc0215ff5752cf89956f19b9fc8e884a7b74f9461327f8627d68d5cf98b3044753a1915e1472f7b59d787df1ae58abe7e2e3844a9b3de2619bed8f2342bc614c03dd41e302c85f2a2a87efb0bf8258206925f1906a11335b949fa3c56daf0e13a77aa1d0ac756680cf726f59507eb8fd525ad4a6baebb2b412ac2d58c714197d50a20e63a7ee0545670fe0f24696fc32a140fa76f03f5abac99c1785cadf09fe073558aa8a612276ef9ec0ad3e887ba5dbfe2f04727f9d99beee67998b8a488e830baa2c6c02de6a6126ebb499550a8e07592e345004bca0ca81119fe0c90ffece6d4e8a3bed5518b1dc1a70f6163f24ead4865626308ed087f934ff7781256c6d6264b3e55024a53b156866388ae56d9101dd19b67b9dad108ba9a2009836b9b25c174ffe98e607e199c157271133495d502613c68b78777fd7751ff910859fc24567e0ea3cfde01b5f9be3c2cb10a6ec7d13f669758c21b8a598d376e0d1897a9702e36c293cd15696ff614422e7423cf3efe0493ff54c07ffce9b98fffa3aee4d0e7135d5b369e8f3170b31f8f6573e9c930ffa4b476a2735b4ade21aadc5658bf8ef5e23359c35d937706ea9495f94491717af3d1a337a9c1acb4f11a74cc90c325843c30f255fbf09bf5856cb542c5d2dc02ed726a491ac2f5dcda66cb58632d9b597daaff788dace11aa59f2d95394412b26e90611fc53452007e8e7dc5f42753e5cf057e189566fb1c30e60f2658e134c0137e56e52d3c9ad5976015ecb64e037a7293cff87f7732e2f8b6603631105966003121596740e2a344c1b0ea2d117020dadffb14c14e72a0a0873b7038874facd39f36ecbf231b978c89d067330062f1038d7e1f44d27d91f1a7e26292cd24ef853e9d7f138bc11fd3fc8bc4b976442caa9d1fb950d5e8f8fb7746bd652770b15856ce69748cfd929530c13a1a4d627d41c5afb2e8358cb2412e7eed689089cfb769554f9e780c09ce65a93f6b481c26be9a6ba7be3c9500e6b3da756cae3413dd13b1ce351545e037bc5dc5244c2716d1a95dcedad8e34795b961a9c18c2a7784d580b4622e5af6d1c3de2846cb3132abbf301613eee48762e21f4d36742ba3705f6fbd7a56bfe5e6ef97439b247471d48ad8a361feb3d36c1f309c371fe6215d70c26e680dca8555e6fc40a8b529360c744dec45932c1c8bd6b8435253f84c6e2ffd9e73eb24d168e0f296cf4cf1806a5b909aa32cc7f25176f2478681c9f644d6a8b9018d303110ff8946ed5b2fce39593f9e13fbaa24f1fcaa2db9a004d4f5e1cbca6be150e49276b207fed898daeb5cc5c201b7cdb5c10df373e003709a132a19f25cfe83296ec398a0ce35b8cb6de098bd89109db5f9f5803560e23e57476b07ff213e0d2ad22167a79faa8e61301d3dc82e5a5f059914cebac4950e58d821600535241cace223da73257c0022e07166d56ec62f3099c4ce86a8fbf891516a580948b3644a1fb8be0eb2f3636dec8b9cfe0b1417b70f035070e52646bb170c4d9243fd3212740c8fba5d382b775704d0de2fa5267d283f3ba22a22bfd15459e00b684bc39b6c3b2e5260461b612047fa4ed9d0347c8ab60e53b2ef965730b29f664b5cc372484b3c7c71bfaf38d70734b03faa0b8ac4c66d4dfafc4062629424bba0b02d411961882706fcb40ddc4678c5f830e6c0b091848ac135db1c5a531a37cda32eb5d649a1c082d307ffad40ae1774c1558c2421ae330e262b69dedbe369b2bb7a8a13250f44bcedf02d2a47d4a6f9e324e14f4eb1660d771561732a7cafe4da5efabde7e6519ef772a208483b29c7f7070dc9bcd5b0d665d95aa3423f0f90d5d40b2ef9708cc5c14c86b59770fbf05fccc8be63029eaf9c78180079f23d5ab121e2451243b0d3ef55e94259c57b338b368cc46dc8eb65752c9e0335571ef77efbfccfb9d045ce5417ce6738658888dc2cfca5e958084f816c24a1cea612e972726bc50fd6f9fd65476fa591ee189dc442b56f4064879ff88337cc020423f8f403a2bbe64d01af3671f2da780dd92d96cc92a1ded193d20ce6ff0c345ddb029da81a26ababb6d80478021779ffd266e512bcdb8b703404f8069bddf047bfa66eec519bdda2e388779bb2be4c1c3c8b26fca1432527e39b7f5010718d9d497d2cbd5160ee4dcb0e91e0520261c91d60f56924a4de937007bd6e8409135f9eb70fcd36542d21430c366db4536a2854225ebdcb0266e005828dc2bfd897ccad190f457afcf863754e9a6cd301625ebde2af5662a36155fcf3e277c264201d5e8ca00ecefac6bf6d8445559fb435c98022629d8161bdda05577b58afc8adf52c388e84e9220fca36f93d27c04e9853d8eed20d180da8298b53527cc6f506707419592ab785f49200d5cf8affb16f85d6805f06d7064a75682c6df64bc61b5c7ca7b8568c023d2eecbf20cd20451a40a21d62999afd49231e3fa529f33ec7d154ee5b6f7bf2d4d5466ebbcfd6e7d7dea927fb57e525adcc649298ac35187a75be1ee8aed4cb67bed3d9eabf8a6ba6dbb181da58fa19e622b4c757b78e10a575949a200d14dc108cf7d17b714204a18e2aaff16578ff55e6e7dbd5aef8bff27a8e05471a629e1ce86d224d10dc531af351734097f311c4fa18d10ff93590b192392682d30c76a8d9af548b7dd4b9d233d8b3759a61a0117246dfd7353d527fbb1a74ea2971835cac11fcd29f7d7af0112b184ce73a4ebc7e80b0bbb221415b8fb483bd97166b348a672203fc5348d77a3bc7024136d094b65e01f04bc61dc4cc5d46ee8493c259b063e04a444840d41f0733d96b4f227ed4a09f3522c3a08a0866103088b4032bfbdd89c0f27f0a8c6161a481eb3e0040d434158f32bcb9b4649b87115ed8151aaab5c748321e31d2693720483b8f83431695182d83cbac6743af825df9b753bd235fb0038ce0b018ac9bd52393965c6084ac480cf53a4b16f777b56098086d49e2dc78b1d4a61c5fb72fc51585ef5b426afd1681bb7729d6db5f146a884f78443d8dd2006186a324bf53c3a9da02b244241b52ef269c7992005216a4d92fe178f87a9abd642563b95f2f30051ab89e89bf1b38a669659dd5dd60dd9dda43454a5d23e1d6114721f2139a3dd437023d91ef5b452e8e037c335e6ced532caad35a653e6f16afafe4a1a69dcca29971ad8cfd3b99954873899aa92fd62578fad08ce255541ea5246ad47cf0f3571d02387859da1d436a49a0002687f1875fd30f353b3ea7eddd8cbc7c7702e27c61ec8ece0f4f2fac73972e0f62250ca63eb35e19f5ba867b5167402b4542c054a81423323275941587f9d68815e6e696bf5607833d35f821c2ce6e95bb3d4e3fdc9959abcbc58503144561764d97edacc860763b43e8751ff0bc9acc36f1ff5cf66158dabb4052efb74e37d16395e7d26098624084860458ff38bad5c16b7fa3cbc370513e486a3fffc08765b0ad8c2583c0a14f649c1306f6fb18f34d4b282010f35dc13c3dfdf69c084e28eff264b9805021bccac64fb2722b9026a422ac56646b6530b6e090f63511c0387cf668cc39a81a83f2d1e05cecd189bbb33cccdd371c9ed859f903348b0f6f3d9034a5643aaca1b28b7255d7604c65ef7e965dee98b55655434770efb6b143003ff5caa9b4e9388740121bc78aa4887a71a830aecf3bd38f595bb2c61a97da0a8bf6bca3d9797263adbb3f34dcee0805449eb1e0cb8d7bd4f7da4f7fadf9f559e5badaca205aff945b8892ac02cf91ae9b283f74958574502e5bd56fb91c54e616f18f3e398ad06db7a45dcf4827470174f19a1baf8b748b648f5d1a10b60b62055a01c49f57616efc16b6cdf8012024ac8754749df206440900cc7ad305329e5014c31b5f0fe66c4d0473fb3e4b7a39b218a790ce3068b629e3006cc34db422917902d68847f7176b793a96addb6c84222211e56c337ec11435ee15ab377c200ba7b48d3fbfd31397e95735360377ac41a4c6e2e3e669ffc63b22941e5c574f60850f292cf783e192a7a79b5319c6204b199582d22edfd5bc1bc92ac1f72b5e70eaff45f7dadd4c101e8517241b5f5596d8f71785e4432f2aa41b50b1bf39e16de18fbd058bb920823f5e63179494ee162db8da24ae8394e33604051957416968f82167c33777225ea805f1f530ce66a42cac6cdff82f4eb5ccc260069a55d92c1491a888047b717228fc44d8165f7180b29bcd007f0dca56668d3fc7c65f4889a0acc0d10a0b62d71108aa7a35dbda1de89f151a662b8a607702c9288b0cbe3a9279c6670a2929650be4334c2c475224354e6e26b2e8c78009e24744ed083a559be200768785f71533a333c8294609ed1cfed16d6d64fed5b1ef833f52fdc65d4f0a74d7c495193adb1d46ff89b56528464a37e12c8d902183b897927de7df96d0c8004e8e6c04634dd8f3f0da2c662cfd2bb5c7cf66efd64af1b890c0f2584c576820d9732129b54be06f1ad4776103de6a82120018aaf43275f846a147aa8d9850482ecf70568ebbceda1a165a7bc60c7672c00408bc7ae24e57ffc3e27318dd5409d0f245d0fa1f1b5c590a0fe6f06cd8f5df4db08cdc297947b087254e1ca3e57929c9cb136cb630128d445be2547c04b8e4779accef0a5f0bcda482941c4b238f1544f525784d81cd221ee8072acacd66fa079dc8ea710708d27f9a4dbe6bd929a64b463613891f689c51cd98f362c36eb80bc957e542acdc2b9c96624c5cee3618f539c12c53d600aaf7a322ccb96f9df43b61e6ee82a91be263dfb53a69b1d47fb030e43183b18e32071f2dc66753e37e166b7b90801267e3cd49ea164fd8d680c0dd76135b2b880f2ade5e42cb0dd0497b8c13ca71c57ab0b8c4a47d46bc37ae32773e95d8d25d74092ae2cab86a4a02c05fbbc3773039662d244945a78d14b1fe27d6b9571821333e771614867411dbcd7e4747888df7a962886d29a8e95e22755bbca4337d6f4f4f00d519959c5a43768b9a1bbcee76a42f827a5e7742e55ff6e076b428ad98186ad66b73d28e19830e2bec091c5a2bbd0d5bc6db302b05514ca80484a2985ef7b940d4dff8662256534adb48464dfe362bad7a2a02731477fa7635a50202c104098cb2703dab8d689be3231ea186f58b193fc4a7c82c50e2db6e2aca5900fefa627f7a970c83eb1f8646ef0808f09943df7b6063638a5db13ca5a4aa82de56123b82342a085dc4dd8f6e9c8d12a9e572c7d97e36f8c5e2b084dd0922d99feae64f532c6cbb8d65eaa6438cf70e730365812751cd2509c8000ffb6f456db494bf15c1f8b7a6bdb88badb5db8bf74952b1e7df42a880adfed5cdb9292ed179fe8befad6dbf0f75b5c3776c57c469af02ae2718cda3a493bf9aacfe5cf54c1ada871c9d1285dd19ed311df1850e98aaac3fa23db85f49dd2f5d84e930b958f6eb19b36ac3422d5133a70667e1c786b417732ff167900ab801f59e2481ea666aba7631c6683a624d4179be7f7e27cb933c24db729af78dd64cc280e6b47353a9a099009f4413162468325fb48a30d48e774b37a2c9a4f07dd85b5df0993947c44f41f593f74b9c54dfd17e240dd296c93b7ae3241a4d3a4375e9470f94f4aabba177b7f612c0e0463cd9fa6b3632560c42aee8978e55f89966b8d0a4d07c75f5e41945aab966f965621a44b6ec0f2a2d2dbf0875c4877eb0558badc16d3de841237e181201499293dcfccbec30077d10a58f3be8eea05b87628b65ed7ca1f0cf3414c14831631817efcf5294c18f01bef9bfb20845c396e9a2f3b619f0418850a1208bbde8c6a8c367019128a945c460495fc0e8196cbbee846ec1ed5a20f6fd72cfaa9870babe283ee282468002ec6bfdd28426df86f91bf1e92b5ac20a4c535bfb84949f1cd23621a016bebf85043ba3316b8b8b19c27c455f624746c20d978200a98bdd49461e7512133d81c457d308f8cc4c2e4159108ed0272495257818d22c42f45d2a860a1aea006f89cd502d792c5f6b489a2836e603175698970ea022f060385e5310397ad5d5b619ec3ed11a20845466f54ca5f891a77a2610955f1d4e0cda3e6539156842a2545a460aa2ec84b5238dc0a294516f02640381bf7b6b4cebe20e0abe8c7b1cf2388a150043d4449fda02ced551557f6d739f0aa576c96739bb6398db1d9c569cb9a2d3427cd8f8642d651f239dcf1006bced33ce2ab2a6cb07ffc931e07a4eddac2d237624bc00485d1aef0279459051353cf73d8a4f53983f8a0efa1335b455f51e621ae9ab05bc0ede53f00f88259232cc94ad3085089b89a7d9a6ceff11e8f90efe2dbbcff2a958b26ec3457ebca7e57e22bcc42a493f66792bf1f84f6ed870c9321fca6d87cc6630c97017e9201ea250030f752ecf833c416c48eb1462799a79c302104e204555ea08feceecc85960d1e37b4554a5c0a41c042514aecb4aba009af0f5e17ed4a298891b2b77c0b1ccffc6cf88df97ae79759c40cd8ac64713f39e072265dcbbf89b00f46a2c447d390985defda9154fa04b1d684fcc1f61b7094b0e15078ec079da66004300624590f41bfa6630cbe581c6f15a52385d58a282f38b9e654498a7ab0f576a7aaf155efac3a52cc55f86abcb945b18420008350bb2b1a7bce89885793a1e5ff2163d4036aaa03356c374c08de7d03e1861d3d05f511ec7e742038ec356aa9d6a16ca0f1f2e896a3bbfc8bb1c1b9215fdb087b86f0cbca2a5e1fed73f4ac183e365f7175cfd9175bf9b6199a0b2724a7b592841e0a321f4970570b09899e8f0cc1b65a8cf9f8403a9bd9dd4d751df4d646ad8d0de384c4440bf3999112ad924de823dbad31e66c49c6cec4e020211804e189d2f868411eadc0799c4170b7569d31a4372b241bf0e8cf04c267cc75b57fa61e07e389fbb6cfeec4e53f1f449ce0b344bca74726ed038fe5aa6c4118cdd5d59e6b128fc2c8b3d4ebd99dd8a3f977dee18bab28795c9a0967f37dcf4f72ea7711a031723d44991f491d37231bb0b840bf922d04ea8b8cba5801a3c7f4dcd24896ed324697b932776269532085c4de3e793bddcfe3925c8aa747595ba3a8be912ece160e1a1cf268bfed686fe14cfc893de7440cd79794f207a748859b21134896f596251c111680e5706c368486a9c0ef05d8e5a9b488be9e41f6547085894be18fd6f3549a42e98fed735c7df23bbf4a11cb073257d6e9521a52c8bbbb3ca02bc56d772df0cbac72fde03dca6397e2642e11469e468f54e1b9ca79c6a2c3aba001312e88b7ad184f4df04fb1aacbf8d2e35e662ef520012e6acb76543e3cf5b809829757357b28abfecca98fc44bfa4a5ed0c29efe096b0762e625d5b8a2616fbb1bbf6dbf80b840d0f90d3499684862478672ba354bf8ce1705fb68e51c4408eb8962221547bc58d4ae99d685e1c065c809efee22a8e2f341c44c81b4700657f6258e06e228a7001a63fad3799852ce56a10a20352223f318a451e20383a53e0704b87ad78fe50c9fc5e39bc463a2d854b866e5b8631f1d061d05c0a6c18db051f3bd02c93df5f544a5f73c08e5a8e7a8707e3726160820bb0dcc42b56fb21ef7e48ecf02b4fad53dfadfed64e10b45dd0be872a60d604777341d94f8c44982fa0fb3364fe1f7a5b03df2bda3be2362a46f3859dfc2f454c54417c526e8dfacd26a7d5e34d833d00a8ca7c6eca590c063826502f63e1d935da395174eebf1f1cb79b5a53949db90e16aa599b95ed37ad919616e2eaf2cf0c3b85333e9f5be2d4992cd8802782ff865804c9db134b138367ec9ddae43834ca8f07ee68103b7756e231508e56c1090786206488f36c7886aace0f983c0caa9a6a786d570b4be5dfa2a4d194d53fa4109c93ec575b841c30cd1c4c564391f7d785f70a324c932f03d62ef544b134faa2bfcabb733af0fe752e1d07f69509280ee28a56e9e7913e662225b684815e64aa9363400bbd4017324d9dfec0a5aaed433aee0d50e98255899b5f156627f38c7bf9d52cf3e1f5a3c49d6fbde119633a1885ad2d3e226247c06a62a64a9ac3f277e1bb21f091ed0d9e8e2e03837834d6e18812f584e0d34942a2d3c1cbcdd3874ebe5a89f4efe6db43fd64874a3f651231f5607633ce89593ad435fbf8c212709b53f1204e11b65533117fea73efda17e3f7354217b286c500a9061e2da93d9194be328fdd0cf4574a8743c35806bc2b8675f0c587de1e51ae46452df9a49fff421928885b10e04a4267413a34a74a8f08a23ad6ef0121235d152377a238a3c24fef2cc3fd7bf55772cbc956c5c7b8673e58ce51068fcf60bbecd21c4938f3b72b7c9a27ee7cc4ab90480437d7d24edd9a902bce53b8f5d8d61ed03dd3aaa21dd1ab08aa8286ab5f8905243fbb7b9d2408108a37771950356431f8ef70a97001b0d27895f0fd6c7ae06d31b71bbaee704372ddb4fea7a365e8afd9f93e5b77d4aef0701673b11769d4077a1989cb148bede6760786866bc28ab217057bd9ea377b0fb3327713aa48a146b3ed3db8a11d45166cd438d285adc66d79985957fccea18f9fc6ddeceb53a6d0e10b2a6afd7c6e74fb527af459e3f35b0c1b2beac0666cc9e1066d9044199d5e84f31f72f75631bd640d30efec589f3de7fa393a5585a6491c0ceb53811bbfca95eae5a444f74b422f94371fd970aa536ac529b5531b0f7b65eb414e0359c20a7916f267159206e956690abf1115987f2a7c0b876501cf1e5a0ab0be3c020b8671300eb71e66be014af37ae44a201ffa4e17e8f3bfbf8bb22626fa066bac282c3a864c29855cbf0b24d81ef88ea45d586cb5d62dedf1887d526660884344b99e211599dd0f6ff5bed7a5c7beae5bea130a5936728b5f038714e85e976bde4d14291b60851b254619add521437c080fabe2d66d7aae80563075ada2d4bfe4c6d57f13458da80c8926e28412a84a1cb3cd5b9c83fc0cfbf409eda42beae2e6b31bd5ad42019ec318cc73bbf79f451bc2318e13b521d3a0ff129d62c671138215a424ef73502705ea1fd7d6ff3cd03accaf4071c1b2e766ebe1b764942d9efcc1e6161bfd90647453c6d31a499d7b18585df96f447c64b3634074fa24c50464c27b27e37fad380c011293680406281c5bcaa26a5a6b72f15670d136c71b33b4bcb4d53cd4a63597543219324d9baaeed4104c23cc7f6b335cd571c8706619fdd517e40028a18a11840b43be02ae7a941aa2b7b98a8b813a8b294b4c6a59c431b9c731d28decc00a3637f30765234db0bd0a644759c978aeeae8cb999ff765d55683e9aa1794665fdc447e10c72ea198e55f36a899e2201e460fbb9504d0eb050f643d775f13e810ffc0085ac10d7f598b2630327b64f2cf8513fab497d0ff38c6641f25ca79ce50ecbfa95d2bb3d425fa38709bea8ff2b3990877813a770857469f01150fa7258715df9db85bcaa7c0145d1a08d991b8ca9fd8de369ed045383606af12fc54f6da77c011e84a95726eab652831b2f0317f7dce23861cef132eb03001165781093d76b7cda70ccf51714d8d045c50c84135b9ac3a6a0b48470f4afc4e67a6a668bca0242fe4c3ca6ca0d1ae56be1df2acad0599bed22078eb51e8b96665134f8161a9d58096b3a08e1f8cda7a2d32c08a14586c2e69c4befb5d92087cda23c3db1c194945355180bf1f66c832b9569dde8e98656218fabd6f6edb74d584f3383884109e276c5a9d3c1cd695947489b6083f1d2a25fc6a19fb99c3a3c58983eae205698ff7dbbb2684018bad16a07cdefc51e6d0e5f62c07015ecd0a9c0efe52fcb3c03b5fda2d510b7a05df3491434e744271b935a131213c9a32881b71a21ca2cb2cb8d370fdcac05df1fad77f5f50e78265a82004e8f3d544d252043f37b130b20faadb7442adc0f8aa18602aafb865b0e70c103066a31010e8a3bc2730d289e3c97a1f1a35aee07b2110d728e5d80559a0a12b92d30d036e43b129f0faf52aa9aa200f78ffbe4326a1adc4e71a1909181d85a41a367562388663eee968582fac484b23bc57721aaf10fe044dbdac26158d067bbab1e8b4981060f6a9c3ef3150d4cfdae01c86fcd117062c0abf678e9a38ab3392c9dc74ba0519fdcff97849a05ebb5372194ffa878ebd3be5e3bb36d0a6b3e3e8575c71e63cf7d6c367227bec3cedd3ce3399ff84fd593c52e5d0e971a8e7697c2ff2cd314a2b2e7df947eb974ef5d71e94bd1714c3731b57248aeda55838adbd35a6553bf1ccd2df90247d7f0aa71193a89e46805189457f170aa6755c4feb265b8b3677265898d618b5efb55e6c9a2d3b4d4315c247df6df0e51d550eb50c55d2cef9bbcd9bec1b5e0fc9c22ba45e4b517eb060fe2231801b0d78d2f3140232b37884c62127e3aa561a5b6d9966d3588e38d71cc3547d8f2965936699d95939999be3d4155196796363865dabc817401ac8af8563364417209a58077cf852bf8958434a83b887d1907a235575644f0679fed74d41b0f2f8f3c4bb55025725409ec93e6c0816f5297d976a51e1e903dd7863014ae33eaa90dd8b0a140ba138f0172f6a0ad9957204cc4ce959a386aee37fb5237501db2115017dfbaae45f9b435dc3bc4654a36757661f608bb2cf42d5b1d2aa5f5254f09c27225c682582bee6e75ed80fe468b6587ec6b61a136ca12c89ea976d0f2628a815ac7dca54c40de39c83587e2e45a199df6920212db399b0fa5525146995934e2d15f4554dc29ef72aac9b6eb63753dd2b3cca910dc37263345f0cb7f464c41acea8d8c3b2e1abddf74884b96f77410442254d4b5df2e16c044ff909a376fd6b770a86e3730099aaee2a837fdc730aa157a6273b1ab2c421c471542802af9f206153a21a9beb768660bd20b157b81ff95e3e84203a64cc4ba73c0735de356204b8c070fe9eea69ccfec7bd149a16d53ae4409c2e4dd54fc7cb84f630c8d0830333c1d5d93477e1d373dd84000375cfcd3d4bd74e303c70b579f3d378d6888a5251aa34938a18852746fc6454d29fff759d7fbe858670ffdf39580e4d6e334dbe63d2207af233ef8bd97403a917eaa96cca836f32a9df11fb8ab691f256af93b5636c233760605f4831c4bb4ffe05bfd0650129763ed9fe161a5c624900daf7973ebf2f0b4d3981b2d74e1538b12be30126078343d4bddb744f621ae1b8033e78ca44030e5135676706f6207bc3f8534e2a1d3fb82a844fd87bac68d4831c74c36d206370d7bf4f009b9ba1e9fc56db1ac483777d5926de5a322868d59948cee1485f74040f940f46370a620229b1220fda00e8f42329799326a07d3b37418d909ea92332104f65f31c9b8b197d73a3460c85c96baae845a011545c3fc3748fadafbb895c1b75fb1257a7e8048c0228e8068dc863e04ab9c21c3f5d07888e3df272b3dfdbfa96e8b4ad1c7f4bae6380edb40b1a5e58631c823eb90b8b9153e8846e617066b70a9109d556ffe227fbcfdd761cf72610964b9e39b21d2ce77351d9f8f1d17f93350532dea2afeb9ca4995cea965541c18eb752e60511ce20da3c56fb9a6fc6f039e878aefa40420b3b4c6bcf689811d1b303e3c81ed2437461cac9c8abc24a3579a8f63ae512aabb516e1a0783ddaeac279a8138e460ffada816b3c986460bd5f6d56972753bc9c39d52a8f3b00ffea329da76e78d3c290523a511bd3af5eb7fbc93524f603ca634b2edab1b9179995a331cb3b26f2b226c11a459c39824e7d62818ee94758280298f7bfbb0ecdd93b4ff76b4e05fd306919fab92a29f757b13460ad831630c66383f7c8bda45588b6cee83617d1625191c4d3799415655aae88cc20e9e7a59231958f97ffc68a80e4321d8dd69287c609817e962b7b22aa12e5df9428126c868b0e10abe712d797161eae2c8f5abe3069a051234abe72ea06fb4a4a752e3ec909b9a3277c11bf3c899aa2b1bbd62e1d39bae4c476ee190590c1abd26121ba3e2397676e2ddbb4eead1b6283b75ed470d9b1261678e5b2b062b9ba060d02dbcc598de2bcfe020e90e46595215168ea677e885cf" + } + ] +} \ No newline at end of file diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/crypto/SphinxSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/crypto/SphinxSpec.scala index abf23816fb..9624d4fa45 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/crypto/SphinxSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/crypto/SphinxSpec.scala @@ -22,10 +22,14 @@ import fr.acinq.eclair.crypto.Sphinx.RouteBlinding.{BlindedRoute, BlindedRouteDe import fr.acinq.eclair.wire.protocol import fr.acinq.eclair.wire.protocol._ import fr.acinq.eclair.{CltvExpiry, CltvExpiryDelta, MilliSatoshiLong, ShortChannelId, UInt64, randomBytes, randomKey} +import org.json4s.JsonAST._ +import org.json4s.jackson.JsonMethods import org.scalatest.funsuite.AnyFunSuite import scodec.bits._ +import java.io.File import scala.concurrent.duration.DurationInt +import scala.io.Source import scala.util.Success /** @@ -444,6 +448,21 @@ class SphinxSpec extends AnyFunSuite { assert(decryptionError == expected) } + test("fat error test vector") { + val src = Source.fromFile(new File(getClass.getResource(s"/fat_error.json").getFile)) + try { + val testVector = JsonMethods.parse(src.mkString).asInstanceOf[JObject].values + val hops = testVector("hops").asInstanceOf[List[Map[String, String]]] + val sharedSecrets = hops.map(hop => ByteVector32(ByteVector.fromValidHex(hop("sharedSecret")))) + val encryptedMessages = hops.map(hop => ByteVector.fromValidHex(hop("encryptedMessage"))) + val nodeIds = (1 to 5).map(_ => randomKey().publicKey) + //println(FatErrorPacket.unwrap(encryptedMessages(0), sharedSecrets(0), 0)) + //println(FatErrorPacket.decrypt(encryptedMessages.head, sharedSecrets.zip(nodeIds))) + } finally { + src.close() + } + } + test("create blinded route (reference test vector)") { val alice = PrivateKey(hex"4141414141414141414141414141414141414141414141414141414141414141") val bob = PrivateKey(hex"4242424242424242424242424242424242424242424242424242424242424242") diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/payment/MultiPartPaymentLifecycleSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/payment/MultiPartPaymentLifecycleSpec.scala index ef13fd1ce7..2d70491051 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/payment/MultiPartPaymentLifecycleSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/payment/MultiPartPaymentLifecycleSpec.scala @@ -378,7 +378,7 @@ class MultiPartPaymentLifecycleSpec extends TestKitBaseClass with FixtureAnyFunS val failures = Seq( LocalFailure(finalAmount, Nil, ChannelUnavailable(randomBytes32())), RemoteFailure(finalAmount, Nil, Sphinx.DecryptedFailurePacket(b, FeeInsufficient(100 msat, makeChannelUpdate(ShortChannelId(2), 15 msat, 150, CltvExpiryDelta(48))))), - UnreadableRemoteFailure(finalAmount, Nil) + UnreadableRemoteFailure(finalAmount, Nil, ???) ) val extraEdges1 = Seq( BasicEdge(a, b, ShortChannelId(1), 10 msat, 0, CltvExpiryDelta(12)), BasicEdge(b, c, ShortChannelId(2), 15 msat, 150, CltvExpiryDelta(48)), @@ -412,14 +412,14 @@ class MultiPartPaymentLifecycleSpec extends TestKitBaseClass with FixtureAnyFunS childPayFsm.expectMsgType[SendPaymentToRoute] val (failedId1, failedRoute1) = payFsm.stateData.asInstanceOf[PaymentProgress].pending.head - childPayFsm.send(payFsm, PaymentFailed(failedId1, paymentHash, Seq(UnreadableRemoteFailure(failedRoute1.amount, failedRoute1.hops)))) + childPayFsm.send(payFsm, PaymentFailed(failedId1, paymentHash, Seq(UnreadableRemoteFailure(failedRoute1.amount, failedRoute1.hops, ???)))) router.expectMsgType[RouteRequest] router.send(payFsm, RouteResponse(Seq(Route(500000 msat, hop_ad :: hop_de :: Nil)))) childPayFsm.expectMsgType[SendPaymentToRoute] assert(!payFsm.stateData.asInstanceOf[PaymentProgress].pending.contains(failedId1)) val (failedId2, failedRoute2) = payFsm.stateData.asInstanceOf[PaymentProgress].pending.head - val result = abortAfterFailure(f, PaymentFailed(failedId2, paymentHash, Seq(UnreadableRemoteFailure(failedRoute2.amount, failedRoute2.hops)))) + val result = abortAfterFailure(f, PaymentFailed(failedId2, paymentHash, Seq(UnreadableRemoteFailure(failedRoute2.amount, failedRoute2.hops, ???)))) assert(result.failures.length >= 3) assert(result.failures.contains(LocalFailure(finalAmount, Nil, RetryExhausted))) @@ -508,7 +508,7 @@ class MultiPartPaymentLifecycleSpec extends TestKitBaseClass with FixtureAnyFunS childPayFsm.expectMsgType[SendPaymentToRoute] val (failedId1, failedRoute1) :: (failedId2, failedRoute2) :: Nil = payFsm.stateData.asInstanceOf[PaymentProgress].pending.toSeq - childPayFsm.send(payFsm, PaymentFailed(failedId1, paymentHash, Seq(UnreadableRemoteFailure(failedRoute1.amount, failedRoute1.hops)))) + childPayFsm.send(payFsm, PaymentFailed(failedId1, paymentHash, Seq(UnreadableRemoteFailure(failedRoute1.amount, failedRoute1.hops, ???)))) router.expectMsgType[RouteRequest] val result = abortAfterFailure(f, PaymentFailed(failedId2, paymentHash, Seq(RemoteFailure(failedRoute2.amount, failedRoute2.hops, Sphinx.DecryptedFailurePacket(e, PaymentTimeout))))) @@ -526,7 +526,7 @@ class MultiPartPaymentLifecycleSpec extends TestKitBaseClass with FixtureAnyFunS childPayFsm.expectMsgType[SendPaymentToRoute] val (failedId, failedRoute) :: (successId, successRoute) :: Nil = payFsm.stateData.asInstanceOf[PaymentProgress].pending.toSeq - childPayFsm.send(payFsm, PaymentFailed(failedId, paymentHash, Seq(UnreadableRemoteFailure(failedRoute.amount, failedRoute.hops)))) + childPayFsm.send(payFsm, PaymentFailed(failedId, paymentHash, Seq(UnreadableRemoteFailure(failedRoute.amount, failedRoute.hops, ???)))) router.expectMsgType[RouteRequest] val result = fulfillPendingPayments(f, 1) diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/payment/PaymentLifecycleSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/payment/PaymentLifecycleSpec.scala index 3bbcd723cb..69194f2e0e 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/payment/PaymentLifecycleSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/payment/PaymentLifecycleSpec.scala @@ -327,7 +327,7 @@ class PaymentLifecycleSpec extends BaseRouterSpec { sender.send(paymentFSM, addCompleted(HtlcResult.RemoteFail(UpdateFailHtlc(ByteVector32.Zeroes, 0, defaultPaymentHash)))) // unparsable message // we allow 2 tries, so we send a 2nd request to the router - assert(sender.expectMsgType[PaymentFailed].failures == UnreadableRemoteFailure(route.amount, route.hops) :: UnreadableRemoteFailure(route.amount, route.hops) :: Nil) + assert(sender.expectMsgType[PaymentFailed].failures == UnreadableRemoteFailure(route.amount, route.hops, ???) :: UnreadableRemoteFailure(route.amount, route.hops, ???) :: Nil) awaitCond(nodeParams.db.payments.getOutgoingPayment(id).exists(_.status.isInstanceOf[OutgoingPaymentStatus.Failed])) // after last attempt the payment is failed val metrics = metricsListener.expectMsgType[PathFindingExperimentMetrics] @@ -794,8 +794,8 @@ class PaymentLifecycleSpec extends BaseRouterSpec { (RemoteFailure(defaultAmountMsat, route_abcd, Sphinx.DecryptedFailurePacket(c, UnknownNextPeer)), Set.empty, Set(ChannelDesc(scid_cd, c, d))), (RemoteFailure(defaultAmountMsat, route_abcd, Sphinx.DecryptedFailurePacket(b, FeeInsufficient(100 msat, update_bc))), Set.empty, Set.empty), // unreadable remote failures -> blacklist all nodes except our direct peer and the final recipient - (UnreadableRemoteFailure(defaultAmountMsat, channelHopFromUpdate(a, b, update_ab) :: Nil), Set.empty, Set.empty), - (UnreadableRemoteFailure(defaultAmountMsat, channelHopFromUpdate(a, b, update_ab) :: channelHopFromUpdate(b, c, update_bc) :: channelHopFromUpdate(c, d, update_cd) :: ChannelHop(ShortChannelId(5656986L), d, e, null) :: Nil), Set(c, d), Set.empty) + (UnreadableRemoteFailure(defaultAmountMsat, channelHopFromUpdate(a, b, update_ab) :: Nil, ???), Set.empty, Set.empty), + (UnreadableRemoteFailure(defaultAmountMsat, channelHopFromUpdate(a, b, update_ab) :: channelHopFromUpdate(b, c, update_bc) :: channelHopFromUpdate(c, d, update_cd) :: ChannelHop(ShortChannelId(5656986L), d, e, null) :: Nil, ???), Set(c, d), Set.empty) ) for ((failure, expectedNodes, expectedChannels) <- testCases) { diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/payment/relay/NodeRelayerSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/payment/relay/NodeRelayerSpec.scala index 78b52cf716..0e78533dfa 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/payment/relay/NodeRelayerSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/payment/relay/NodeRelayerSpec.scala @@ -615,7 +615,7 @@ class NodeRelayerSpec extends ScalaTestWithActorTestKit(ConfigFactory.load("appl val payFSM = mockPayFSM.expectMessageType[akka.actor.ActorRef] router.expectMessageType[RouteRequest] - val failures = RemoteFailure(outgoingAmount, Nil, Sphinx.DecryptedFailurePacket(outgoingNodeId, FinalIncorrectHtlcAmount(42 msat))) :: UnreadableRemoteFailure(outgoingAmount, Nil) :: Nil + val failures = RemoteFailure(outgoingAmount, Nil, Sphinx.DecryptedFailurePacket(outgoingNodeId, FinalIncorrectHtlcAmount(42 msat))) :: UnreadableRemoteFailure(outgoingAmount, Nil, ???) :: Nil payFSM ! PaymentFailed(relayId, incomingMultiPart.head.add.paymentHash, failures) incomingMultiPart.foreach { p =>