From 71a93194385e43e6f7485d670030e7300a156c1e Mon Sep 17 00:00:00 2001 From: yarkin Date: Thu, 9 Nov 2023 11:14:30 +0800 Subject: [PATCH 01/24] Make code compile with refactored bls12-381. --- libraries/chain/webassembly/crypto.cpp | 78 +++++++++---------- libraries/libfc/libraries/bls12-381 | 2 +- libraries/libfc/test/crypto/test_bls.cpp | 99 +++--------------------- 3 files changed, 49 insertions(+), 130 deletions(-) diff --git a/libraries/chain/webassembly/crypto.cpp b/libraries/chain/webassembly/crypto.cpp index 606ca383e7..0e43e7b506 100644 --- a/libraries/chain/webassembly/crypto.cpp +++ b/libraries/chain/webassembly/crypto.cpp @@ -256,12 +256,12 @@ namespace eosio { namespace chain { namespace webassembly { { if(op1.size() != 144 || op2.size() != 144 || result.size() != 144) return return_code::failure; - std::optional a = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)op1.data(), 144), false, true); - std::optional b = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)op2.data(), 144), false, true); - if(!a.has_value() || !b.has_value()) + std::optional a = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)op1.data(), 144), true, false); + std::optional b = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)op2.data(), 144), true, false); + if(!a || !b) return return_code::failure; - bls12_381::g1 c = a.value().add(b.value()); - c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 144), true); + bls12_381::g1 c = a->add(*b); + c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 144), false); return return_code::success; } @@ -269,12 +269,12 @@ namespace eosio { namespace chain { namespace webassembly { { if(op1.size() != 288 || op2.size() != 288 || result.size() != 288) return return_code::failure; - std::optional a = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)op1.data(), 288), false, true); - std::optional b = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)op2.data(), 288), false, true); - if(!a.has_value() || !b.has_value()) + std::optional a = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)op1.data(), 288), true, false); + std::optional b = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)op2.data(), 288), true, false); + if(!a || !b) return return_code::failure; - bls12_381::g2 c = a.value().add(b.value()); - c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 288), true); + bls12_381::g2 c = a->add(*b); + c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 288), false); return return_code::success; } @@ -282,12 +282,12 @@ namespace eosio { namespace chain { namespace webassembly { { if(point.size() != 144 || scalar.size() != 32 || result.size() != 144) return return_code::failure; - std::optional a = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)point.data(), 144), false, true); - if(!a.has_value()) + std::optional a = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)point.data(), 144), true, false); + if(!a) return return_code::failure; std::array b = bls12_381::scalar::fromBytesLE<4>(std::span((uint8_t*)scalar.data(), 32)); - bls12_381::g1 c = a.value().mulScalar(b); - c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 144), true); + bls12_381::g1 c = a->scale(b); + c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 144), false); return return_code::success; } @@ -295,12 +295,12 @@ namespace eosio { namespace chain { namespace webassembly { { if(point.size() != 288 || scalar.size() != 32 || result.size() != 288) return return_code::failure; - std::optional a = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)point.data(), 288), false, true); - if(!a.has_value()) + std::optional a = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)point.data(), 288), true, false); + if(!a) return return_code::failure; std::array b = bls12_381::scalar::fromBytesLE<4>(std::span((uint8_t*)scalar.data(), 32)); - bls12_381::g2 c = a.value().mulScalar(b); - c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 288), true); + bls12_381::g2 c = a->scale(b); + c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 288), false); return return_code::success; } @@ -314,7 +314,7 @@ namespace eosio { namespace chain { namespace webassembly { sv.reserve(n); for(uint32_t i = 0; i < n; i++) { - std::optional p = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)points.data() + i*144, 144), false, true); + std::optional p = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)points.data() + i*144, 144), true, false); if(!p.has_value()) return return_code::failure; std::array s = bls12_381::scalar::fromBytesLE<4>(std::span((const uint8_t*)scalars.data() + i*32, 32)); @@ -323,8 +323,8 @@ namespace eosio { namespace chain { namespace webassembly { if(i%10 == 0) context.trx_context.checktime(); } - bls12_381::g1 r = bls12_381::g1::multiExp(pv, sv, [this](){ context.trx_context.checktime(); }).value(); // accessing value is safe - r.toJacobianBytesLE(std::span((uint8_t*)result.data(), 144), true); + bls12_381::g1 r = bls12_381::g1::weightedSum(pv, sv, [this](){ context.trx_context.checktime(); }); // accessing value is safe + r.toJacobianBytesLE(std::span((uint8_t*)result.data(), 144), false); return return_code::success; } @@ -338,17 +338,17 @@ namespace eosio { namespace chain { namespace webassembly { sv.reserve(n); for(uint32_t i = 0; i < n; i++) { - std::optional p = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)points.data() + i*288, 288), false, true); - if(!p.has_value()) + std::optional p = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)points.data() + i*288, 288), true, false); + if(!p) return return_code::failure; std::array s = bls12_381::scalar::fromBytesLE<4>(std::span((const uint8_t*)scalars.data() + i*32, 32)); - pv.push_back(p.value()); + pv.push_back(*p); sv.push_back(s); if(i%6 == 0) context.trx_context.checktime(); } - bls12_381::g2 r = bls12_381::g2::multiExp(pv, sv, [this](){ context.trx_context.checktime(); }).value(); // accessing value is safe - r.toJacobianBytesLE(std::span((uint8_t*)result.data(), 288), true); + bls12_381::g2 r = bls12_381::g2::weightedSum(pv, sv, [this](){ context.trx_context.checktime(); }); // accessing value is safe + r.toJacobianBytesLE(std::span((uint8_t*)result.data(), 288), false); return return_code::success; } @@ -360,16 +360,16 @@ namespace eosio { namespace chain { namespace webassembly { v.reserve(n); for(uint32_t i = 0; i < n; i++) { - std::optional p_g1 = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)g1_points.data() + i*144, 144), true, true); - std::optional p_g2 = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)g2_points.data() + i*288, 288), true, true); - if(!p_g1.has_value() || !p_g2.has_value()) + std::optional p_g1 = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)g1_points.data() + i*144, 144), true, false); + std::optional p_g2 = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)g2_points.data() + i*288, 288), true, false); + if(!p_g1 || !p_g2) return return_code::failure; - bls12_381::pairing::add_pair(v, p_g1.value(), p_g2.value()); + bls12_381::pairing::add_pair(v, *p_g1, *p_g2); if(i%4 == 0) context.trx_context.checktime(); } bls12_381::fp12 r = bls12_381::pairing::calculate(v, [this](){ context.trx_context.checktime(); }); - r.toBytesLE(std::span((uint8_t*)result.data(), 576), true); + r.toBytesLE(std::span((uint8_t*)result.data(), 576), false); return return_code::success; } @@ -377,11 +377,11 @@ namespace eosio { namespace chain { namespace webassembly { { if(e.size() != 48 || result.size() != 144) return return_code::failure; - std::optional a = bls12_381::fp::fromBytesLE(std::span((const uint8_t*)e.data(), 48), true, true); - if(!a.has_value()) + std::optional a = bls12_381::fp::fromBytesLE(std::span((const uint8_t*)e.data(), 48), true, false); + if(!a) return return_code::failure; - bls12_381::g1 c = bls12_381::g1::mapToCurve(a.value()); - c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 144), true); + bls12_381::g1 c = bls12_381::g1::mapToCurve(*a); + c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 144), false); return return_code::success; } @@ -389,11 +389,11 @@ namespace eosio { namespace chain { namespace webassembly { { if(e.size() != 96 || result.size() != 288) return return_code::failure; - std::optional a = bls12_381::fp2::fromBytesLE(std::span((const uint8_t*)e.data(), 96), true, true); - if(!a.has_value()) + std::optional a = bls12_381::fp2::fromBytesLE(std::span((const uint8_t*)e.data(), 96), true, false); + if(!a) return return_code::failure; - bls12_381::g2 c = bls12_381::g2::mapToCurve(a.value()); - c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 288), true); + bls12_381::g2 c = bls12_381::g2::mapToCurve(*a); + c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 288), false); return return_code::success; } diff --git a/libraries/libfc/libraries/bls12-381 b/libraries/libfc/libraries/bls12-381 index d79a183664..e3893a85cd 160000 --- a/libraries/libfc/libraries/bls12-381 +++ b/libraries/libfc/libraries/bls12-381 @@ -1 +1 @@ -Subproject commit d79a1836649d6f9b7494ccc3e9a1320a7470acaa +Subproject commit e3893a85cd1598cb8ff1bfa288898148249237d4 diff --git a/libraries/libfc/test/crypto/test_bls.cpp b/libraries/libfc/test/crypto/test_bls.cpp index 569c2c4e91..f91118f6e2 100644 --- a/libraries/libfc/test/crypto/test_bls.cpp +++ b/libraries/libfc/test/crypto/test_bls.cpp @@ -54,9 +54,9 @@ BOOST_AUTO_TEST_CASE(bls_agg_sig_verify) try { g1 pk2 = public_key(sk2); g2 sig2 = sign(sk2, message_2); - g2 aggSig = aggregate_signatures({sig1, sig2}); + g2 aggSig = aggregate_signatures(vector {sig1, sig2}); - bool ok = aggregate_verify({pk1, pk2}, {message_1, message_2}, aggSig); + bool ok = aggregate_verify(vector{pk1, pk2}, vector>{message_1, message_2}, aggSig); BOOST_CHECK_EQUAL(ok, true); } FC_LOG_AND_RETHROW(); @@ -70,15 +70,15 @@ BOOST_AUTO_TEST_CASE(bls_agg_tree_verify) try { g1 pk2 = public_key(sk2); g2 sig2 = sign(sk2, message_2); - g2 aggSig = aggregate_signatures({sig1, sig2}); + g2 aggSig = aggregate_signatures(vector {sig1, sig2}); array sk3 = secret_key(seed_3); g1 pk3 = public_key(sk3); g2 sig3 = sign(sk3, message_3); - g2 aggSigFinal = aggregate_signatures({aggSig, sig3}); + g2 aggSigFinal = aggregate_signatures(vector {aggSig, sig3}); - bool ok = aggregate_verify({pk1, pk2, pk3}, {message_1, message_2, message_3}, aggSigFinal); + bool ok = aggregate_verify(vector{pk1, pk2, pk3}, vector>{message_1, message_2, message_3}, aggSigFinal); BOOST_CHECK_EQUAL(ok, true); } FC_LOG_AND_RETHROW(); @@ -96,8 +96,8 @@ BOOST_AUTO_TEST_CASE(bls_agg_pk_verify) try { g1 pk3 = public_key(sk3); g2 sig3 = sign(sk3, message_1); - g2 sigAgg = aggregate_signatures({sig1, sig2, sig3}); - g1 pkAgg = aggregate_public_keys({pk1, pk2, pk3}); + g2 sigAgg = aggregate_signatures(vector {sig1, sig2, sig3}); + g1 pkAgg = aggregate_public_keys(vector {pk1, pk2, pk3}); bool ok = verify(pkAgg, message_1, sigAgg); BOOST_CHECK_EQUAL(ok, true); @@ -128,92 +128,11 @@ BOOST_AUTO_TEST_CASE(bls_pop_verify) try { g1 pk2 = public_key(sk2); g2 sig2 = sign(sk2, message_1); - g2 aggsig = aggregate_signatures({sig1, sig2}); - bool ok = pop_fast_aggregate_verify({pk1, pk2}, message_1, aggsig); + g2 aggsig = aggregate_signatures(vector {sig1, sig2}); + bool ok = pop_fast_aggregate_verify(vector{pk1, pk2}, message_1, aggsig); BOOST_CHECK_EQUAL(ok, true); } FC_LOG_AND_RETHROW(); -BOOST_AUTO_TEST_CASE(g1_add_garbage) try { - fp x({0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF}); - g1 p({x, x, x}); - BOOST_CHECK_EQUAL(x.isValid(), false); - BOOST_CHECK_EQUAL(p.isOnCurve(), false); - BOOST_CHECK_EQUAL(p.inCorrectSubgroup(), false); - p = p.add(p); - BOOST_CHECK_EQUAL(p.isOnCurve(), false); - BOOST_CHECK_EQUAL(p.inCorrectSubgroup(), false); - g1 p_res = g1::fromJacobianBytesBE(hexToBytes<144>("0x16ebb8f4fc6d887a8de3892d7765b224e3be0f36357a686712241e5767c245ec7d9fc4130046ed883e31ec7d2400d69b02c2a8b22ceaac76c93d771a681011c66189e08d3a16e69aa7484528ffe9d89fbe1664fdff95578c830e0fbfc72447800ffc7c19987633398fa120983552fa3ecab80aa3bdcc0913014c80513279e56ce11624eaffddf5f82fa804b27016e591"), false, true).value(); - BOOST_CHECK_EQUAL(p.equal(p_res), true); -} FC_LOG_AND_RETHROW(); - -BOOST_AUTO_TEST_CASE(g2_add_garbage) try { - fp x({0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF}); - g2 p({fp2({x, x}), fp2({x, x}), fp2({x, x})}); - BOOST_CHECK_EQUAL(x.isValid(), false); - BOOST_CHECK_EQUAL(p.isOnCurve(), false); - BOOST_CHECK_EQUAL(p.inCorrectSubgroup(), false); - p = p.add(p); - BOOST_CHECK_EQUAL(p.isOnCurve(), false); - BOOST_CHECK_EQUAL(p.inCorrectSubgroup(), false); - g2 p_res = g2::fromJacobianBytesBE(hexToBytes<288>("0x121776a6107dd86184188133433092b521527d235a298207529d4ca1679f9794cd3cb7b659cdccbfea32ada2d46fdf3ef7f0b08b6d3cfbad209ba461e8bdc55aadc7da5ac22f4e67b5a88062646f2ece0934d01ca6485f299f47cd132da484600df7cabe551c79ec8622ec6c73e03e2635ee50e36584b13b7f371b634bc00910932bd543a35b45dc33d90bc36d38c88202988dd47f01acf772efd5446c81949ebdc19ca53273a1f07a449b084faf4c8c329179e392dd49ffd4d0c81ce02ae50b35ef56f72b6d4b067b495bc80cfce0eb0d3e6d9aebea696b61e198f9b8bb2394ae2049e1c3c7ebf2d5590964e030cb27000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), false, true).value(); - BOOST_CHECK_EQUAL(p.equal(p_res), true); -} FC_LOG_AND_RETHROW(); - -BOOST_AUTO_TEST_CASE(g1_mul_garbage) try { - fp x({0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF}); - g1 p({x, x, x}); - BOOST_CHECK_EQUAL(x.isValid(), false); - BOOST_CHECK_EQUAL(p.isOnCurve(), false); - BOOST_CHECK_EQUAL(p.inCorrectSubgroup(), false); - array s = {0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF}; - p = p.mulScalar(s); - BOOST_CHECK_EQUAL(p.isOnCurve(), false); - BOOST_CHECK_EQUAL(p.inCorrectSubgroup(), false); - g1 p_res = g1::fromJacobianBytesBE(hexToBytes<144>("0x0cf5e7694dd3cbfd944aa8a1412826451b247cc74148a1c289831a869c2bf644d8eacf23970af6d167fe0efe4e79b8b61183d39242b00320670c7474c28aeda64187e877d9972619702fc9459876563ea9f8054a4a22262a3566e3af5a4970510e9213062adcdd95878b09e3901d27f47b77a2dc03923eb313856cf2991eb7ec1f76d8da7a832bfc4db4735821ff9081"), false, true).value(); - BOOST_CHECK_EQUAL(p.equal(p_res), true); -} FC_LOG_AND_RETHROW(); - -BOOST_AUTO_TEST_CASE(g2_mul_garbage) try { - fp x({0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF}); - g2 p({fp2({x, x}), fp2({x, x}), fp2({x, x})}); - BOOST_CHECK_EQUAL(x.isValid(), false); - BOOST_CHECK_EQUAL(p.isOnCurve(), false); - BOOST_CHECK_EQUAL(p.inCorrectSubgroup(), false); - array s = {0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF}; - p = p.mulScalar(s); - BOOST_CHECK_EQUAL(p.isOnCurve(), false); - BOOST_CHECK_EQUAL(p.inCorrectSubgroup(), false); - g2 p_res = g2::fromJacobianBytesBE(hexToBytes<288>("0x1203754ff2c1cd33f92b7fbad909540237721c0311f3935762719feca1d4e8d5006824434283611b87fadcc93b41b79318f1bb3b6a6ce403bfac295e096ea17a61d553fbed89f453a78232e88eab2767907eb9f75e9e325db106abd65f5de13d013ed4f63b9142ecdaf225888e13285adb14384fb623ce33a640e04dadcb38090f60d99767be09abe35b3c2337819e50038f9df049cbf0ee1c481560d7fe03be89e3fa68a5f69aab20a40ac2c522ecd89e5e5859753dfa4ecbde951b2e5ae732146f8f94d30becf0c33b7833728f9a0e8292f574d85fd1bf82fef8cb79ff1b5e6bf15e3000027fa9e9e6f670f956220b02fb798444358ffed2efa8999e5ffc27a57a08c8cc44c02ee47cc2ee4e535c046217196095c26de1f4a5ba9866c15c93"), false, true).value(); - BOOST_CHECK_EQUAL(p.equal(p_res), true); -} FC_LOG_AND_RETHROW(); - -BOOST_AUTO_TEST_CASE(g1_exp_garbage) try { - fp x({0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF}); - g1 p({x, x, x}); - BOOST_CHECK_EQUAL(x.isValid(), false); - BOOST_CHECK_EQUAL(p.isOnCurve(), false); - BOOST_CHECK_EQUAL(p.inCorrectSubgroup(), false); - array s = {0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF}; - p = g1::multiExp({p}, {s}).value(); - BOOST_CHECK_EQUAL(p.isOnCurve(), false); - BOOST_CHECK_EQUAL(p.inCorrectSubgroup(), false); - g1 p_res = g1::fromJacobianBytesBE(hexToBytes<144>("0x181b676153b877407d2622e91af6057f5ff445f160c178517828841670debdd61957f8d5376ddeeb1ba0a204eb1eafb007f9d1417540591155acddd91f1fb9c97da24d6eecae002c50a779372dfc247efb1823e27abbdae09fb515f390e982311239b452c1ef85156c979f981ac69208f6fd0014fa9dd66a1999df7fa4a0a4234a4cc14ec62291fd3f924b8353b326b9"), false, true).value(); - BOOST_CHECK_EQUAL(p.equal(p_res), true); -} FC_LOG_AND_RETHROW(); - -BOOST_AUTO_TEST_CASE(g2_exp_garbage) try { - fp x({0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF}); - g2 p({fp2({x, x}), fp2({x, x}), fp2({x, x})}); - BOOST_CHECK_EQUAL(x.isValid(), false); - BOOST_CHECK_EQUAL(p.isOnCurve(), false); - BOOST_CHECK_EQUAL(p.inCorrectSubgroup(), false); - array s = {0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF}; - p = g2::multiExp({p}, {s}).value(); - BOOST_CHECK_EQUAL(p.isOnCurve(), false); - BOOST_CHECK_EQUAL(p.inCorrectSubgroup(), false); - g2 p_res = g2::fromJacobianBytesBE(hexToBytes<288>("0x158a2a1e3ce68c49f9795908aa3779c6919ed5de5cbcd1d2a331d0742d1eb3cb28014006b5f686204adb5fdca73aea570ee0f0d58880907c8de5867dd99b6b7306b2c3de4a1537e6d042f2b8e44c8086853728cc246726016b0fcf993db3d759005f8ac0cb55113c857c5cf3f83d9b624ce9a2a0a00a1206777cf935721c857b322a611ed0703cf3e922bfb8b19a1f5e10a341b2191ab5a15d35f69850d2adb633e5425eecb7f38dd486a95b3f74d60f3ee6cf692b3c76813407710630763f7605b3828c19203f661732a02f7f546ab354694128bbe5a792a9db4a443c0fe10af0df2bc1b8d07aee99bd6f8c6b26847011aa31634f42f722d52022c736369db470576687fdf819cf15a0db4c01a0bd7028ee17cefdf6d66557d47fb725b6d00f"), false, true).value(); - BOOST_CHECK_EQUAL(p.equal(p_res), true); -} FC_LOG_AND_RETHROW(); BOOST_AUTO_TEST_SUITE_END() From eea0ea3110f11c747ac05c792e35d0d6c37a1b15 Mon Sep 17 00:00:00 2001 From: yarkin Date: Thu, 9 Nov 2023 15:28:27 +0800 Subject: [PATCH 02/24] Refactor some interfaces, compiling, not tested yet. --- .../eosio/chain/webassembly/interface.hpp | 88 ++++++-- libraries/chain/webassembly/crypto.cpp | 193 +++++++++++++++--- .../chain/webassembly/runtimes/eos-vm.cpp | 13 +- 3 files changed, 248 insertions(+), 46 deletions(-) diff --git a/libraries/chain/include/eosio/chain/webassembly/interface.hpp b/libraries/chain/include/eosio/chain/webassembly/interface.hpp index 59fac5078a..24d3b06fdd 100644 --- a/libraries/chain/include/eosio/chain/webassembly/interface.hpp +++ b/libraries/chain/include/eosio/chain/webassembly/interface.hpp @@ -1796,6 +1796,17 @@ namespace webassembly { */ int32_t bls_g1_add(span op1, span op2, span result) const; + /** + * Host function for G1 addition on the elliptic curve bls12-381 + * + * @ingroup crypto + * @param op1 - a span containing the first operand G1 point in Montgemory form. + * @param op2 - a span containing the second operand G1 point in Montgemory form. + * @param[out] result - the result op1 + op2 in Montgemory form. + * @return -1 if there was an error 0 otherwise + */ + int32_t bls_g1_add_mont(span op1, span op2, span result) const; + /** * Host function for G2 addition on the elliptic curve bls12-381 * @@ -1808,41 +1819,42 @@ namespace webassembly { int32_t bls_g2_add(span op1, span op2, span result) const; /** - * Host function for G1 scalar multiplication on the elliptic curve bls12-381 + * Host function for G2 addition on the elliptic curve bls12-381 * * @ingroup crypto - * @param point - a span containing the G1 point operand. - * @param scalar - a span containing the scalar operand. - * @param[out] result - the result: scalar * point. + * @param op1 - a span containing the first operand G2 point in Montgemory form. + * @param op2 - a span containing the second operand G2 point in Montgemory form. + * @param[out] result - the result op1 + op2 in Montgemory form. * @return -1 if there was an error 0 otherwise */ - int32_t bls_g1_mul(span point, span scalar, span result) const; + int32_t bls_g2_add_mont(span op1, span op2, span result) const; /** - * Host function for G2 scalar multiplication on the elliptic curve bls12-381 + * Host function for G1 weighted sum (multi-exponentiation) on the elliptic curve bls12-381 * * @ingroup crypto - * @param point - a span containing the G2 point operand. - * @param scalar - a span containing the scalar operand. - * @param[out] result - the result op1 * op2. + * @param points - a span containing a list of G1 points (P0, P1, P2... Pn). + * @param scalars - a span containing a list of scalars (s0, s1, s2... sn). + * @param n - the number of elements in the lists. + * @param[out] result - the result s0 * P0 + s1 * P1 + ... + sn * Pn. * @return -1 if there was an error 0 otherwise */ - int32_t bls_g2_mul(span point, span scalar, span result) const; + int32_t bls_g1_weighted_sum(span points, span scalars, const uint32_t n, span result) const; /** - * Host function for G1 multi-exponentiation on the elliptic curve bls12-381 + * Host function for G1 weighted sum (multi-exponentiation) on the elliptic curve bls12-381 * * @ingroup crypto - * @param points - a span containing a list of G1 points (P0, P1, P2... Pn). + * @param points - a span containing a list of G1 points (P0, P1, P2... Pn) in Montgemory form. * @param scalars - a span containing a list of scalars (s0, s1, s2... sn). * @param n - the number of elements in the lists. - * @param[out] result - the result s0 * P0 + s1 * P1 + ... + sn * Pn. + * @param[out] result - the result s0 * P0 + s1 * P1 + ... + sn * Pn in Montgemory form. * @return -1 if there was an error 0 otherwise */ - int32_t bls_g1_exp(span points, span scalars, const uint32_t n, span result) const; + int32_t bls_g1_weighted_sum_mont(span points, span scalars, const uint32_t n, span result) const; /** - * Host function for G2 multi-exponentiation on the elliptic curve bls12-381 + * Host function for G2 weighted sum (multi-exponentiation) on the elliptic curve bls12-381 * * @ingroup crypto * @param points - a span containing a list of G2 points (P0, P1, P2... Pn). @@ -1851,7 +1863,19 @@ namespace webassembly { * @param[out] result - the result s0 * P0 + s1 * P1 + ... + sn * Pn. * @return -1 if there was an error 0 otherwise */ - int32_t bls_g2_exp(span points, span scalars, const uint32_t n, span result) const; + int32_t bls_g2_weighted_sum(span points, span scalars, const uint32_t n, span result) const; + + /** + * Host function for G2 weighted sum (multi-exponentiation) on the elliptic curve bls12-381 + * + * @ingroup crypto + * @param points - a span containing a list of G2 points (P0, P1, P2... Pn) in Montgemory form. + * @param scalars - a span containing a list of scalars (s0, s1, s2... sn). + * @param n - the number of elements in the lists. + * @param[out] result - the result s0 * P0 + s1 * P1 + ... + sn * Pn in Montgemory form. + * @return -1 if there was an error 0 otherwise + */ + int32_t bls_g2_weighted_sum_mont(span points, span scalars, const uint32_t n, span result) const; /** * Host function to calculate the pairing of (G1, G2) pairs on the elliptic curve bls12-381 @@ -1865,6 +1889,18 @@ namespace webassembly { */ int32_t bls_pairing(span g1_points, span g2_points, const uint32_t n, span result) const; + /** + * Host function to calculate the pairing of (G1, G2) pairs on the elliptic curve bls12-381 + * + * @ingroup crypto + * @param g1_points - a span containing a list of G1 points (P0, P1, P2... Pn) in Montgemory form. + * @param g2_points - a span containing a list of G2 points (P0, P1, P2... Pn) in Montgemory form. + * @param n - the number of elements in the lists. + * @param[out] result - the result e(g1_0, g2_0) * e(g1_1, g2_1) * ... * e(g1_n, g2_n) in Montgemory form. + * @return -1 if there was an error 0 otherwise + */ + int32_t bls_pairing_mont(span g1_points, span g2_points, const uint32_t n, span result) const; + /** * Host function for mapping fp to G1 on the elliptic curve bls12-381 * @@ -1875,6 +1911,16 @@ namespace webassembly { */ int32_t bls_g1_map(span e, span result) const; + /** + * Host function for mapping fp to G1 on the elliptic curve bls12-381 + * + * @ingroup crypto + * @param e - a span containing the field element fp to be mapped in Montgemory form. + * @param[out] result - the resulting element in G1 in Montgemory form. + * @return -1 if there was an error 0 otherwise + */ + int32_t bls_g1_map_mont(span e, span result) const; + /** * Host function for mapping fp2 to G2 on the elliptic curve bls12-381 * @@ -1885,6 +1931,16 @@ namespace webassembly { */ int32_t bls_g2_map(span e, span result) const; + /** + * Host function for mapping fp2 to G2 on the elliptic curve bls12-381 + * + * @ingroup crypto + * @param e - a span containing the field element fp2 to be mapped in Montgemory form. + * @param[out] result - the resulting element in G2 in Montgemory form. + * @return -1 if there was an error 0 otherwise + */ + int32_t bls_g2_map_mont(span e, span result) const; + /** * Host function for modular reduction of 64 bytes wide scalar to a field element (fp, 48 bytes) of the elliptic curve bls12-381 * Involves Montgomery conversion on the resulting field element. diff --git a/libraries/chain/webassembly/crypto.cpp b/libraries/chain/webassembly/crypto.cpp index 0e43e7b506..d496c6c462 100644 --- a/libraries/chain/webassembly/crypto.cpp +++ b/libraries/chain/webassembly/crypto.cpp @@ -278,43 +278,172 @@ namespace eosio { namespace chain { namespace webassembly { return return_code::success; } - int32_t interface::bls_g1_mul(span point, span scalar, span result) const + int32_t interface::bls_g1_weighted_sum(span points, span scalars, const uint32_t n, span result) const { - if(point.size() != 144 || scalar.size() != 32 || result.size() != 144) + if(points.size() != n*144 || scalars.size() != n*32 || result.size() != 144) + return return_code::failure; + + // Use much efficient scale for the special case of n == 1. + if (1 == n) { + std::optional a = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)points.data(), 144), true, false); + if(!a) + return return_code::failure; + std::array b = bls12_381::scalar::fromBytesLE<4>(std::span((uint8_t*)scalars.data(), 32)); + bls12_381::g1 c = a->scale(b); + c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 144), false); + return return_code::success; + } + + std::vector pv; + std::vector> sv; + pv.reserve(n); + sv.reserve(n); + for(uint32_t i = 0; i < n; i++) + { + std::optional p = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)points.data() + i*144, 144), true, false); + if(!p.has_value()) + return return_code::failure; + std::array s = bls12_381::scalar::fromBytesLE<4>(std::span((const uint8_t*)scalars.data() + i*32, 32)); + pv.push_back(p.value()); + sv.push_back(s); + if(i%10 == 0) + context.trx_context.checktime(); + } + bls12_381::g1 r = bls12_381::g1::weightedSum(pv, sv, [this](){ context.trx_context.checktime(); }); // accessing value is safe + r.toJacobianBytesLE(std::span((uint8_t*)result.data(), 144), false); + return return_code::success; + } + + int32_t interface::bls_g2_weighted_sum(span points, span scalars, const uint32_t n, span result) const + { + if(points.size() != n*288 || scalars.size() != n*32 || result.size() != 288) + return return_code::failure; + + // Use much efficient scale for the special case of n == 1. + if (1 == n) { + std::optional a = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)points.data(), 288), true, false); + if(!a) + return return_code::failure; + std::array b = bls12_381::scalar::fromBytesLE<4>(std::span((uint8_t*)scalars.data(), 32)); + bls12_381::g2 c = a->scale(b); + c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 288), false); + return return_code::success; + } + + std::vector pv; + std::vector> sv; + pv.reserve(n); + sv.reserve(n); + for(uint32_t i = 0; i < n; i++) + { + std::optional p = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)points.data() + i*288, 288), true, false); + if(!p) + return return_code::failure; + std::array s = bls12_381::scalar::fromBytesLE<4>(std::span((const uint8_t*)scalars.data() + i*32, 32)); + pv.push_back(*p); + sv.push_back(s); + if(i%6 == 0) + context.trx_context.checktime(); + } + bls12_381::g2 r = bls12_381::g2::weightedSum(pv, sv, [this](){ context.trx_context.checktime(); }); // accessing value is safe + r.toJacobianBytesLE(std::span((uint8_t*)result.data(), 288), false); + return return_code::success; + } + + int32_t interface::bls_pairing(span g1_points, span g2_points, const uint32_t n, span result) const + { + if(g1_points.size() != n*144 || g2_points.size() != n*288 || result.size() != 576) return return_code::failure; - std::optional a = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)point.data(), 144), true, false); + std::vector> v; + v.reserve(n); + for(uint32_t i = 0; i < n; i++) + { + std::optional p_g1 = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)g1_points.data() + i*144, 144), true, false); + std::optional p_g2 = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)g2_points.data() + i*288, 288), true, false); + if(!p_g1 || !p_g2) + return return_code::failure; + bls12_381::pairing::add_pair(v, *p_g1, *p_g2); + if(i%4 == 0) + context.trx_context.checktime(); + } + bls12_381::fp12 r = bls12_381::pairing::calculate(v, [this](){ context.trx_context.checktime(); }); + r.toBytesLE(std::span((uint8_t*)result.data(), 576), false); + return return_code::success; + } + + int32_t interface::bls_g1_map(span e, span result) const + { + if(e.size() != 48 || result.size() != 144) + return return_code::failure; + std::optional a = bls12_381::fp::fromBytesLE(std::span((const uint8_t*)e.data(), 48), true, false); if(!a) return return_code::failure; - std::array b = bls12_381::scalar::fromBytesLE<4>(std::span((uint8_t*)scalar.data(), 32)); - bls12_381::g1 c = a->scale(b); + bls12_381::g1 c = bls12_381::g1::mapToCurve(*a); c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 144), false); return return_code::success; } - int32_t interface::bls_g2_mul(span point, span scalar, span result) const + int32_t interface::bls_g2_map(span e, span result) const { - if(point.size() != 288 || scalar.size() != 32 || result.size() != 288) + if(e.size() != 96 || result.size() != 288) return return_code::failure; - std::optional a = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)point.data(), 288), true, false); + std::optional a = bls12_381::fp2::fromBytesLE(std::span((const uint8_t*)e.data(), 96), true, false); if(!a) return return_code::failure; - std::array b = bls12_381::scalar::fromBytesLE<4>(std::span((uint8_t*)scalar.data(), 32)); - bls12_381::g2 c = a->scale(b); + bls12_381::g2 c = bls12_381::g2::mapToCurve(*a); c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 288), false); return return_code::success; } - int32_t interface::bls_g1_exp(span points, span scalars, const uint32_t n, span result) const + int32_t interface::bls_g1_add_mont(span op1, span op2, span result) const + { + if(op1.size() != 144 || op2.size() != 144 || result.size() != 144) + return return_code::failure; + std::optional a = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)op1.data(), 144), true, true); + std::optional b = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)op2.data(), 144), true, true); + if(!a || !b) + return return_code::failure; + bls12_381::g1 c = a->add(*b); + c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 144), true); + return return_code::success; + } + + int32_t interface::bls_g2_add_mont(span op1, span op2, span result) const + { + if(op1.size() != 288 || op2.size() != 288 || result.size() != 288) + return return_code::failure; + std::optional a = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)op1.data(), 288), true, true); + std::optional b = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)op2.data(), 288), true, true); + if(!a || !b) + return return_code::failure; + bls12_381::g2 c = a->add(*b); + c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 288), true); + return return_code::success; + } + + int32_t interface::bls_g1_weighted_sum_mont(span points, span scalars, const uint32_t n, span result) const { if(points.size() != n*144 || scalars.size() != n*32 || result.size() != 144) return return_code::failure; + + // Use much efficient scale for the special case of n == 1. + if (1 == n) { + std::optional a = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)points.data(), 144), true, true); + if(!a) + return return_code::failure; + std::array b = bls12_381::scalar::fromBytesLE<4>(std::span((uint8_t*)scalars.data(), 32)); + bls12_381::g1 c = a->scale(b); + c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 144), true); + return return_code::success; + } + std::vector pv; std::vector> sv; pv.reserve(n); sv.reserve(n); for(uint32_t i = 0; i < n; i++) { - std::optional p = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)points.data() + i*144, 144), true, false); + std::optional p = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)points.data() + i*144, 144), true, true); if(!p.has_value()) return return_code::failure; std::array s = bls12_381::scalar::fromBytesLE<4>(std::span((const uint8_t*)scalars.data() + i*32, 32)); @@ -324,21 +453,33 @@ namespace eosio { namespace chain { namespace webassembly { context.trx_context.checktime(); } bls12_381::g1 r = bls12_381::g1::weightedSum(pv, sv, [this](){ context.trx_context.checktime(); }); // accessing value is safe - r.toJacobianBytesLE(std::span((uint8_t*)result.data(), 144), false); + r.toJacobianBytesLE(std::span((uint8_t*)result.data(), 144), true); return return_code::success; } - int32_t interface::bls_g2_exp(span points, span scalars, const uint32_t n, span result) const + int32_t interface::bls_g2_weighted_sum_mont(span points, span scalars, const uint32_t n, span result) const { if(points.size() != n*288 || scalars.size() != n*32 || result.size() != 288) return return_code::failure; + + // Use much efficient scale for the special case of n == 1. + if (1 == n) { + std::optional a = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)points.data(), 288), true, true); + if(!a) + return return_code::failure; + std::array b = bls12_381::scalar::fromBytesLE<4>(std::span((uint8_t*)scalars.data(), 32)); + bls12_381::g2 c = a->scale(b); + c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 288), true); + return return_code::success; + } + std::vector pv; std::vector> sv; pv.reserve(n); sv.reserve(n); for(uint32_t i = 0; i < n; i++) { - std::optional p = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)points.data() + i*288, 288), true, false); + std::optional p = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)points.data() + i*288, 288), true, true); if(!p) return return_code::failure; std::array s = bls12_381::scalar::fromBytesLE<4>(std::span((const uint8_t*)scalars.data() + i*32, 32)); @@ -348,11 +489,11 @@ namespace eosio { namespace chain { namespace webassembly { context.trx_context.checktime(); } bls12_381::g2 r = bls12_381::g2::weightedSum(pv, sv, [this](){ context.trx_context.checktime(); }); // accessing value is safe - r.toJacobianBytesLE(std::span((uint8_t*)result.data(), 288), false); + r.toJacobianBytesLE(std::span((uint8_t*)result.data(), 288), true); return return_code::success; } - int32_t interface::bls_pairing(span g1_points, span g2_points, const uint32_t n, span result) const + int32_t interface::bls_pairing_mont(span g1_points, span g2_points, const uint32_t n, span result) const { if(g1_points.size() != n*144 || g2_points.size() != n*288 || result.size() != 576) return return_code::failure; @@ -360,8 +501,8 @@ namespace eosio { namespace chain { namespace webassembly { v.reserve(n); for(uint32_t i = 0; i < n; i++) { - std::optional p_g1 = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)g1_points.data() + i*144, 144), true, false); - std::optional p_g2 = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)g2_points.data() + i*288, 288), true, false); + std::optional p_g1 = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)g1_points.data() + i*144, 144), true, true); + std::optional p_g2 = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)g2_points.data() + i*288, 288), true, true); if(!p_g1 || !p_g2) return return_code::failure; bls12_381::pairing::add_pair(v, *p_g1, *p_g2); @@ -369,31 +510,31 @@ namespace eosio { namespace chain { namespace webassembly { context.trx_context.checktime(); } bls12_381::fp12 r = bls12_381::pairing::calculate(v, [this](){ context.trx_context.checktime(); }); - r.toBytesLE(std::span((uint8_t*)result.data(), 576), false); + r.toBytesLE(std::span((uint8_t*)result.data(), 576), true); return return_code::success; } - int32_t interface::bls_g1_map(span e, span result) const + int32_t interface::bls_g1_map_mont(span e, span result) const { if(e.size() != 48 || result.size() != 144) return return_code::failure; - std::optional a = bls12_381::fp::fromBytesLE(std::span((const uint8_t*)e.data(), 48), true, false); + std::optional a = bls12_381::fp::fromBytesLE(std::span((const uint8_t*)e.data(), 48), true, true); if(!a) return return_code::failure; bls12_381::g1 c = bls12_381::g1::mapToCurve(*a); - c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 144), false); + c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 144), true); return return_code::success; } - int32_t interface::bls_g2_map(span e, span result) const + int32_t interface::bls_g2_map_mont(span e, span result) const { if(e.size() != 96 || result.size() != 288) return return_code::failure; - std::optional a = bls12_381::fp2::fromBytesLE(std::span((const uint8_t*)e.data(), 96), true, false); + std::optional a = bls12_381::fp2::fromBytesLE(std::span((const uint8_t*)e.data(), 96), true, true); if(!a) return return_code::failure; bls12_381::g2 c = bls12_381::g2::mapToCurve(*a); - c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 288), false); + c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 288), true); return return_code::success; } diff --git a/libraries/chain/webassembly/runtimes/eos-vm.cpp b/libraries/chain/webassembly/runtimes/eos-vm.cpp index 813affc045..a0e9d30447 100644 --- a/libraries/chain/webassembly/runtimes/eos-vm.cpp +++ b/libraries/chain/webassembly/runtimes/eos-vm.cpp @@ -640,13 +640,18 @@ REGISTER_CF_HOST_FUNCTION( k1_recover ); // bls_primitives protocol feature REGISTER_CF_HOST_FUNCTION( bls_g1_add ); REGISTER_CF_HOST_FUNCTION( bls_g2_add ); -REGISTER_CF_HOST_FUNCTION( bls_g1_mul ); -REGISTER_CF_HOST_FUNCTION( bls_g2_mul ); -REGISTER_CF_HOST_FUNCTION( bls_g1_exp ); -REGISTER_CF_HOST_FUNCTION( bls_g2_exp ); +REGISTER_CF_HOST_FUNCTION( bls_g1_weighted_sum ); +REGISTER_CF_HOST_FUNCTION( bls_g2_weighted_sum ); REGISTER_CF_HOST_FUNCTION( bls_pairing ); REGISTER_CF_HOST_FUNCTION( bls_g1_map ); REGISTER_CF_HOST_FUNCTION( bls_g2_map ); +REGISTER_CF_HOST_FUNCTION( bls_g1_add_mont ); +REGISTER_CF_HOST_FUNCTION( bls_g2_add_mont ); +REGISTER_CF_HOST_FUNCTION( bls_g1_weighted_sum_mont ); +REGISTER_CF_HOST_FUNCTION( bls_g2_weighted_sum_mont ); +REGISTER_CF_HOST_FUNCTION( bls_pairing_mont ); +REGISTER_CF_HOST_FUNCTION( bls_g1_map_mont ); +REGISTER_CF_HOST_FUNCTION( bls_g2_map_mont ); REGISTER_CF_HOST_FUNCTION( bls_fp_mod ); } // namespace webassembly From fa5989107f7270270f8201f941f4cc2028e3bb44 Mon Sep 17 00:00:00 2001 From: yarkin Date: Fri, 10 Nov 2023 23:30:05 +0800 Subject: [PATCH 03/24] Refactor bls_gx calls. --- libraries/chain/controller.cpp | 13 +- .../eos-vm-oc/intrinsic_mapping.hpp | 13 +- libraries/chain/webassembly/crypto.cpp | 418 ++++++++---------- 3 files changed, 193 insertions(+), 251 deletions(-) diff --git a/libraries/chain/controller.cpp b/libraries/chain/controller.cpp index 51e1d4a198..ae068631c3 100644 --- a/libraries/chain/controller.cpp +++ b/libraries/chain/controller.cpp @@ -3845,13 +3845,18 @@ void controller_impl::on_activation( db.modify( db.get(), [&]( auto& ps ) { add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_g1_add" ); add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_g2_add" ); - add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_g1_mul" ); - add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_g2_mul" ); - add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_g1_exp" ); - add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_g2_exp" ); + add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_g1_weighted_sum" ); + add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_g2_weighted_sum" ); add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_pairing" ); add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_g1_map" ); add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_g2_map" ); + add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_g1_add_mont" ); + add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_g2_add_mont" ); + add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_g1_weighted_sum_mont" ); + add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_g2_weighted_sum_mont" ); + add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_pairing_mont" ); + add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_g1_map_mont" ); + add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_g2_map_mont" ); add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_fp_mod" ); } ); } diff --git a/libraries/chain/include/eosio/chain/webassembly/eos-vm-oc/intrinsic_mapping.hpp b/libraries/chain/include/eosio/chain/webassembly/eos-vm-oc/intrinsic_mapping.hpp index ea92a9cf86..20a242de2c 100644 --- a/libraries/chain/include/eosio/chain/webassembly/eos-vm-oc/intrinsic_mapping.hpp +++ b/libraries/chain/include/eosio/chain/webassembly/eos-vm-oc/intrinsic_mapping.hpp @@ -270,13 +270,18 @@ inline constexpr auto get_intrinsic_table() { "env.get_block_num", "env.bls_g1_add", "env.bls_g2_add", - "env.bls_g1_mul", - "env.bls_g2_mul", - "env.bls_g1_exp", - "env.bls_g2_exp", + "env.bls_g1_weighted_sum", + "env.bls_g2_weighted_sum", "env.bls_pairing", "env.bls_g1_map", "env.bls_g2_map", + "env.bls_g1_add_mont", + "env.bls_g2_add_mont", + "env.bls_g1_weighted_sum_mont", + "env.bls_g2_weighted_sum_mont", + "env.bls_pairing_mont", + "env.bls_g1_map_mont", + "env.bls_g2_map_mont", "env.bls_fp_mod" ); } diff --git a/libraries/chain/webassembly/crypto.cpp b/libraries/chain/webassembly/crypto.cpp index d496c6c462..e4d26ed9eb 100644 --- a/libraries/chain/webassembly/crypto.cpp +++ b/libraries/chain/webassembly/crypto.cpp @@ -10,6 +10,7 @@ #include #include +// local helpers namespace { uint32_t ceil_log2(uint32_t n) { @@ -20,6 +21,154 @@ namespace { }; } +// bls implementation +namespace { + using eosio::chain::span; + using eosio::chain::webassembly::return_code; + + int32_t bls_g1_add_impl(span op1, span op2, span result, bool mont) { + if(op1.size() != 144 || op2.size() != 144 || result.size() != 144) + return return_code::failure; + std::optional a = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)op1.data(), 144), true, mont); + std::optional b = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)op2.data(), 144), true, mont); + if(!a || !b) + return return_code::failure; + bls12_381::g1 c = a->add(*b); + c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 144), mont); + return return_code::success; + } + + int32_t bls_g2_add_impl(span op1, span op2, span result, bool mont) + { + if(op1.size() != 288 || op2.size() != 288 || result.size() != 288) + return return_code::failure; + std::optional a = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)op1.data(), 288), true, mont); + std::optional b = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)op2.data(), 288), true, mont); + if(!a || !b) + return return_code::failure; + bls12_381::g2 c = a->add(*b); + c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 288), mont); + return return_code::success; + } + + int32_t bls_g1_weighted_sum_impl(span points, span scalars, const uint32_t n, span result, const std::function& yield, bool mont) + { + if(points.size() != n*144 || scalars.size() != n*32 || result.size() != 144) + return return_code::failure; + + // Use much efficient scale for the special case of n == 1. + if (1 == n) { + std::optional a = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)points.data(), 144), true, mont); + if(!a) + return return_code::failure; + std::array b = bls12_381::scalar::fromBytesLE<4>(std::span((uint8_t*)scalars.data(), 32)); + bls12_381::g1 c = a->scale(b); + c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 144), mont); + return return_code::success; + } + + std::vector pv; + std::vector> sv; + pv.reserve(n); + sv.reserve(n); + for(uint32_t i = 0; i < n; i++) + { + std::optional p = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)points.data() + i*144, 144), true, mont); + if(!p.has_value()) + return return_code::failure; + std::array s = bls12_381::scalar::fromBytesLE<4>(std::span((const uint8_t*)scalars.data() + i*32, 32)); + pv.push_back(p.value()); + sv.push_back(s); + if(i%10 == 0) + yield(); + } + bls12_381::g1 r = bls12_381::g1::weightedSum(pv, sv, yield); // accessing value is safe + r.toJacobianBytesLE(std::span((uint8_t*)result.data(), 144), mont); + return return_code::success; + } + + int32_t bls_g2_weighted_sum_impl(span points, span scalars, const uint32_t n, span result, const std::function& yield, bool mont) + { + if(points.size() != n*288 || scalars.size() != n*32 || result.size() != 288) + return return_code::failure; + + // Use much efficient scale for the special case of n == 1. + if (1 == n) { + std::optional a = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)points.data(), 288), true, mont); + if(!a) + return return_code::failure; + std::array b = bls12_381::scalar::fromBytesLE<4>(std::span((uint8_t*)scalars.data(), 32)); + bls12_381::g2 c = a->scale(b); + c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 288), mont); + return return_code::success; + } + + std::vector pv; + std::vector> sv; + pv.reserve(n); + sv.reserve(n); + for(uint32_t i = 0; i < n; i++) + { + std::optional p = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)points.data() + i*288, 288), true, mont); + if(!p) + return return_code::failure; + std::array s = bls12_381::scalar::fromBytesLE<4>(std::span((const uint8_t*)scalars.data() + i*32, 32)); + pv.push_back(*p); + sv.push_back(s); + if(i%6 == 0) + yield(); + } + bls12_381::g2 r = bls12_381::g2::weightedSum(pv, sv, yield); // accessing value is safe + r.toJacobianBytesLE(std::span((uint8_t*)result.data(), 288), mont); + return return_code::success; + } + + int32_t bls_pairing_impl(span g1_points, span g2_points, const uint32_t n, span result, const std::function& yield, bool mont) + { + if(g1_points.size() != n*144 || g2_points.size() != n*288 || result.size() != 576) + return return_code::failure; + std::vector> v; + v.reserve(n); + for(uint32_t i = 0; i < n; i++) + { + std::optional p_g1 = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)g1_points.data() + i*144, 144), true, mont); + std::optional p_g2 = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)g2_points.data() + i*288, 288), true, mont); + if(!p_g1 || !p_g2) + return return_code::failure; + bls12_381::pairing::add_pair(v, *p_g1, *p_g2); + if(i%4 == 0) + yield(); + } + bls12_381::fp12 r = bls12_381::pairing::calculate(v, yield); + r.toBytesLE(std::span((uint8_t*)result.data(), 576), mont); + return return_code::success; + } + + int32_t bls_g1_map_impl(span e, span result, bool mont) + { + if(e.size() != 48 || result.size() != 144) + return return_code::failure; + std::optional a = bls12_381::fp::fromBytesLE(std::span((const uint8_t*)e.data(), 48), true, mont); + if(!a) + return return_code::failure; + bls12_381::g1 c = bls12_381::g1::mapToCurve(*a); + c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 144), mont); + return return_code::success; + } + + int32_t bls_g2_map_impl(span e, span result, bool mont) + { + if(e.size() != 96 || result.size() != 288) + return return_code::failure; + std::optional a = bls12_381::fp2::fromBytesLE(std::span((const uint8_t*)e.data(), 96), true, mont); + if(!a) + return return_code::failure; + bls12_381::g2 c = bls12_381::g2::mapToCurve(*a); + c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 288), mont); + return return_code::success; + } +} + namespace eosio { namespace chain { namespace webassembly { void interface::assert_recover_key( legacy_ptr digest, @@ -254,288 +403,71 @@ namespace eosio { namespace chain { namespace webassembly { int32_t interface::bls_g1_add(span op1, span op2, span result) const { - if(op1.size() != 144 || op2.size() != 144 || result.size() != 144) - return return_code::failure; - std::optional a = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)op1.data(), 144), true, false); - std::optional b = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)op2.data(), 144), true, false); - if(!a || !b) - return return_code::failure; - bls12_381::g1 c = a->add(*b); - c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 144), false); - return return_code::success; + return bls_g1_add_impl(op1, op2, result, false); } - int32_t interface::bls_g2_add(span op1, span op2, span result) const + int32_t interface::bls_g1_add_mont(span op1, span op2, span result) const { - if(op1.size() != 288 || op2.size() != 288 || result.size() != 288) - return return_code::failure; - std::optional a = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)op1.data(), 288), true, false); - std::optional b = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)op2.data(), 288), true, false); - if(!a || !b) - return return_code::failure; - bls12_381::g2 c = a->add(*b); - c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 288), false); - return return_code::success; + return bls_g1_add_impl(op1, op2, result, true); } - int32_t interface::bls_g1_weighted_sum(span points, span scalars, const uint32_t n, span result) const + int32_t interface::bls_g2_add(span op1, span op2, span result) const { - if(points.size() != n*144 || scalars.size() != n*32 || result.size() != 144) - return return_code::failure; - - // Use much efficient scale for the special case of n == 1. - if (1 == n) { - std::optional a = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)points.data(), 144), true, false); - if(!a) - return return_code::failure; - std::array b = bls12_381::scalar::fromBytesLE<4>(std::span((uint8_t*)scalars.data(), 32)); - bls12_381::g1 c = a->scale(b); - c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 144), false); - return return_code::success; - } - - std::vector pv; - std::vector> sv; - pv.reserve(n); - sv.reserve(n); - for(uint32_t i = 0; i < n; i++) - { - std::optional p = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)points.data() + i*144, 144), true, false); - if(!p.has_value()) - return return_code::failure; - std::array s = bls12_381::scalar::fromBytesLE<4>(std::span((const uint8_t*)scalars.data() + i*32, 32)); - pv.push_back(p.value()); - sv.push_back(s); - if(i%10 == 0) - context.trx_context.checktime(); - } - bls12_381::g1 r = bls12_381::g1::weightedSum(pv, sv, [this](){ context.trx_context.checktime(); }); // accessing value is safe - r.toJacobianBytesLE(std::span((uint8_t*)result.data(), 144), false); - return return_code::success; + return bls_g2_add_impl(op1, op2, result, false); } - int32_t interface::bls_g2_weighted_sum(span points, span scalars, const uint32_t n, span result) const + int32_t interface::bls_g2_add_mont(span op1, span op2, span result) const { - if(points.size() != n*288 || scalars.size() != n*32 || result.size() != 288) - return return_code::failure; - - // Use much efficient scale for the special case of n == 1. - if (1 == n) { - std::optional a = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)points.data(), 288), true, false); - if(!a) - return return_code::failure; - std::array b = bls12_381::scalar::fromBytesLE<4>(std::span((uint8_t*)scalars.data(), 32)); - bls12_381::g2 c = a->scale(b); - c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 288), false); - return return_code::success; - } - - std::vector pv; - std::vector> sv; - pv.reserve(n); - sv.reserve(n); - for(uint32_t i = 0; i < n; i++) - { - std::optional p = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)points.data() + i*288, 288), true, false); - if(!p) - return return_code::failure; - std::array s = bls12_381::scalar::fromBytesLE<4>(std::span((const uint8_t*)scalars.data() + i*32, 32)); - pv.push_back(*p); - sv.push_back(s); - if(i%6 == 0) - context.trx_context.checktime(); - } - bls12_381::g2 r = bls12_381::g2::weightedSum(pv, sv, [this](){ context.trx_context.checktime(); }); // accessing value is safe - r.toJacobianBytesLE(std::span((uint8_t*)result.data(), 288), false); - return return_code::success; + return bls_g2_add_impl(op1, op2, result, true); } - int32_t interface::bls_pairing(span g1_points, span g2_points, const uint32_t n, span result) const + int32_t interface::bls_g1_weighted_sum(span points, span scalars, const uint32_t n, span result) const { - if(g1_points.size() != n*144 || g2_points.size() != n*288 || result.size() != 576) - return return_code::failure; - std::vector> v; - v.reserve(n); - for(uint32_t i = 0; i < n; i++) - { - std::optional p_g1 = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)g1_points.data() + i*144, 144), true, false); - std::optional p_g2 = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)g2_points.data() + i*288, 288), true, false); - if(!p_g1 || !p_g2) - return return_code::failure; - bls12_381::pairing::add_pair(v, *p_g1, *p_g2); - if(i%4 == 0) - context.trx_context.checktime(); - } - bls12_381::fp12 r = bls12_381::pairing::calculate(v, [this](){ context.trx_context.checktime(); }); - r.toBytesLE(std::span((uint8_t*)result.data(), 576), false); - return return_code::success; + return bls_g1_weighted_sum_impl(points, scalars, n, result, [this](){ context.trx_context.checktime(); }, false); } - - int32_t interface::bls_g1_map(span e, span result) const + int32_t interface::bls_g1_weighted_sum_mont(span points, span scalars, const uint32_t n, span result) const { - if(e.size() != 48 || result.size() != 144) - return return_code::failure; - std::optional a = bls12_381::fp::fromBytesLE(std::span((const uint8_t*)e.data(), 48), true, false); - if(!a) - return return_code::failure; - bls12_381::g1 c = bls12_381::g1::mapToCurve(*a); - c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 144), false); - return return_code::success; + return bls_g1_weighted_sum_impl(points, scalars, n, result, [this](){ context.trx_context.checktime(); }, true); } - int32_t interface::bls_g2_map(span e, span result) const + int32_t interface::bls_g2_weighted_sum(span points, span scalars, const uint32_t n, span result) const { - if(e.size() != 96 || result.size() != 288) - return return_code::failure; - std::optional a = bls12_381::fp2::fromBytesLE(std::span((const uint8_t*)e.data(), 96), true, false); - if(!a) - return return_code::failure; - bls12_381::g2 c = bls12_381::g2::mapToCurve(*a); - c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 288), false); - return return_code::success; + return bls_g2_weighted_sum_impl(points, scalars, n, result, [this](){ context.trx_context.checktime(); }, false); } - int32_t interface::bls_g1_add_mont(span op1, span op2, span result) const + int32_t interface::bls_g2_weighted_sum_mont(span points, span scalars, const uint32_t n, span result) const { - if(op1.size() != 144 || op2.size() != 144 || result.size() != 144) - return return_code::failure; - std::optional a = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)op1.data(), 144), true, true); - std::optional b = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)op2.data(), 144), true, true); - if(!a || !b) - return return_code::failure; - bls12_381::g1 c = a->add(*b); - c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 144), true); - return return_code::success; + return bls_g2_weighted_sum_impl(points, scalars, n, result, [this](){ context.trx_context.checktime(); }, true); } - int32_t interface::bls_g2_add_mont(span op1, span op2, span result) const + int32_t interface::bls_pairing(span g1_points, span g2_points, const uint32_t n, span result) const { - if(op1.size() != 288 || op2.size() != 288 || result.size() != 288) - return return_code::failure; - std::optional a = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)op1.data(), 288), true, true); - std::optional b = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)op2.data(), 288), true, true); - if(!a || !b) - return return_code::failure; - bls12_381::g2 c = a->add(*b); - c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 288), true); - return return_code::success; + return bls_pairing_impl(g1_points, g2_points, n, result, [this](){ context.trx_context.checktime(); }, false); } - int32_t interface::bls_g1_weighted_sum_mont(span points, span scalars, const uint32_t n, span result) const + int32_t interface::bls_pairing_mont(span g1_points, span g2_points, const uint32_t n, span result) const { - if(points.size() != n*144 || scalars.size() != n*32 || result.size() != 144) - return return_code::failure; - - // Use much efficient scale for the special case of n == 1. - if (1 == n) { - std::optional a = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)points.data(), 144), true, true); - if(!a) - return return_code::failure; - std::array b = bls12_381::scalar::fromBytesLE<4>(std::span((uint8_t*)scalars.data(), 32)); - bls12_381::g1 c = a->scale(b); - c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 144), true); - return return_code::success; - } - - std::vector pv; - std::vector> sv; - pv.reserve(n); - sv.reserve(n); - for(uint32_t i = 0; i < n; i++) - { - std::optional p = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)points.data() + i*144, 144), true, true); - if(!p.has_value()) - return return_code::failure; - std::array s = bls12_381::scalar::fromBytesLE<4>(std::span((const uint8_t*)scalars.data() + i*32, 32)); - pv.push_back(p.value()); - sv.push_back(s); - if(i%10 == 0) - context.trx_context.checktime(); - } - bls12_381::g1 r = bls12_381::g1::weightedSum(pv, sv, [this](){ context.trx_context.checktime(); }); // accessing value is safe - r.toJacobianBytesLE(std::span((uint8_t*)result.data(), 144), true); - return return_code::success; + return bls_pairing_impl(g1_points, g2_points, n, result, [this](){ context.trx_context.checktime(); }, true); } - int32_t interface::bls_g2_weighted_sum_mont(span points, span scalars, const uint32_t n, span result) const + int32_t interface::bls_g1_map(span e, span result) const { - if(points.size() != n*288 || scalars.size() != n*32 || result.size() != 288) - return return_code::failure; - - // Use much efficient scale for the special case of n == 1. - if (1 == n) { - std::optional a = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)points.data(), 288), true, true); - if(!a) - return return_code::failure; - std::array b = bls12_381::scalar::fromBytesLE<4>(std::span((uint8_t*)scalars.data(), 32)); - bls12_381::g2 c = a->scale(b); - c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 288), true); - return return_code::success; - } - - std::vector pv; - std::vector> sv; - pv.reserve(n); - sv.reserve(n); - for(uint32_t i = 0; i < n; i++) - { - std::optional p = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)points.data() + i*288, 288), true, true); - if(!p) - return return_code::failure; - std::array s = bls12_381::scalar::fromBytesLE<4>(std::span((const uint8_t*)scalars.data() + i*32, 32)); - pv.push_back(*p); - sv.push_back(s); - if(i%6 == 0) - context.trx_context.checktime(); - } - bls12_381::g2 r = bls12_381::g2::weightedSum(pv, sv, [this](){ context.trx_context.checktime(); }); // accessing value is safe - r.toJacobianBytesLE(std::span((uint8_t*)result.data(), 288), true); - return return_code::success; + return bls_g1_map_impl(e, result, false); } - int32_t interface::bls_pairing_mont(span g1_points, span g2_points, const uint32_t n, span result) const + int32_t interface::bls_g1_map_mont(span e, span result) const { - if(g1_points.size() != n*144 || g2_points.size() != n*288 || result.size() != 576) - return return_code::failure; - std::vector> v; - v.reserve(n); - for(uint32_t i = 0; i < n; i++) - { - std::optional p_g1 = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)g1_points.data() + i*144, 144), true, true); - std::optional p_g2 = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)g2_points.data() + i*288, 288), true, true); - if(!p_g1 || !p_g2) - return return_code::failure; - bls12_381::pairing::add_pair(v, *p_g1, *p_g2); - if(i%4 == 0) - context.trx_context.checktime(); - } - bls12_381::fp12 r = bls12_381::pairing::calculate(v, [this](){ context.trx_context.checktime(); }); - r.toBytesLE(std::span((uint8_t*)result.data(), 576), true); - return return_code::success; + return bls_g1_map_impl(e, result, true); } - int32_t interface::bls_g1_map_mont(span e, span result) const + int32_t interface::bls_g2_map(span e, span result) const { - if(e.size() != 48 || result.size() != 144) - return return_code::failure; - std::optional a = bls12_381::fp::fromBytesLE(std::span((const uint8_t*)e.data(), 48), true, true); - if(!a) - return return_code::failure; - bls12_381::g1 c = bls12_381::g1::mapToCurve(*a); - c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 144), true); - return return_code::success; + return bls_g2_map_impl(e, result, false); } int32_t interface::bls_g2_map_mont(span e, span result) const { - if(e.size() != 96 || result.size() != 288) - return return_code::failure; - std::optional a = bls12_381::fp2::fromBytesLE(std::span((const uint8_t*)e.data(), 96), true, true); - if(!a) - return return_code::failure; - bls12_381::g2 c = bls12_381::g2::mapToCurve(*a); - c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 288), true); - return return_code::success; + return bls_g2_map_impl(e, result, true); } int32_t interface::bls_fp_mod(span s, span result) const From d8dc3603c7243179f38704f0770ff83dad087281 Mon Sep 17 00:00:00 2001 From: yarkin Date: Sat, 11 Nov 2023 00:20:28 +0800 Subject: [PATCH 04/24] Add bls_fp_mod and bls_fp_exp --- libraries/chain/controller.cpp | 8 +- .../eos-vm-oc/intrinsic_mapping.hpp | 9 +- .../eosio/chain/webassembly/interface.hpp | 91 +++++++++++++++---- libraries/chain/webassembly/crypto.cpp | 71 +++++++++++++-- .../chain/webassembly/runtimes/eos-vm.cpp | 7 +- 5 files changed, 159 insertions(+), 27 deletions(-) diff --git a/libraries/chain/controller.cpp b/libraries/chain/controller.cpp index ae068631c3..87025b21ea 100644 --- a/libraries/chain/controller.cpp +++ b/libraries/chain/controller.cpp @@ -3850,6 +3850,9 @@ void controller_impl::on_activation( add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_pairing" ); add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_g1_map" ); add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_g2_map" ); + add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_fp_mod" ); + add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_fp_mul" ); + add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_fp_exp" ); add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_g1_add_mont" ); add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_g2_add_mont" ); add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_g1_weighted_sum_mont" ); @@ -3857,7 +3860,10 @@ void controller_impl::on_activation( add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_pairing_mont" ); add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_g1_map_mont" ); add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_g2_map_mont" ); - add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_fp_mod" ); + add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_fp_mod_mont" ); + add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_fp_mul_mont" ); + add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_fp_exp_mont" ); + } ); } diff --git a/libraries/chain/include/eosio/chain/webassembly/eos-vm-oc/intrinsic_mapping.hpp b/libraries/chain/include/eosio/chain/webassembly/eos-vm-oc/intrinsic_mapping.hpp index 20a242de2c..ee12edeb7d 100644 --- a/libraries/chain/include/eosio/chain/webassembly/eos-vm-oc/intrinsic_mapping.hpp +++ b/libraries/chain/include/eosio/chain/webassembly/eos-vm-oc/intrinsic_mapping.hpp @@ -275,6 +275,9 @@ inline constexpr auto get_intrinsic_table() { "env.bls_pairing", "env.bls_g1_map", "env.bls_g2_map", + "env.bls_fp_mod", + "env.bls_fp_mul", + "env.bls_fp_exp", "env.bls_g1_add_mont", "env.bls_g2_add_mont", "env.bls_g1_weighted_sum_mont", @@ -282,7 +285,11 @@ inline constexpr auto get_intrinsic_table() { "env.bls_pairing_mont", "env.bls_g1_map_mont", "env.bls_g2_map_mont", - "env.bls_fp_mod" + "env.bls_fp_mod_mont", + "env.bls_fp_mul_mont", + "env.bls_fp_exp_mont", + + ); } inline constexpr std::size_t find_intrinsic_index(std::string_view hf) { diff --git a/libraries/chain/include/eosio/chain/webassembly/interface.hpp b/libraries/chain/include/eosio/chain/webassembly/interface.hpp index 24d3b06fdd..e759d4a1cd 100644 --- a/libraries/chain/include/eosio/chain/webassembly/interface.hpp +++ b/libraries/chain/include/eosio/chain/webassembly/interface.hpp @@ -1800,9 +1800,9 @@ namespace webassembly { * Host function for G1 addition on the elliptic curve bls12-381 * * @ingroup crypto - * @param op1 - a span containing the first operand G1 point in Montgemory form. - * @param op2 - a span containing the second operand G1 point in Montgemory form. - * @param[out] result - the result op1 + op2 in Montgemory form. + * @param op1 - a span containing the first operand G1 point in Montgomery form. + * @param op2 - a span containing the second operand G1 point in Montgomery form. + * @param[out] result - the result op1 + op2 in Montgomery form. * @return -1 if there was an error 0 otherwise */ int32_t bls_g1_add_mont(span op1, span op2, span result) const; @@ -1822,9 +1822,9 @@ namespace webassembly { * Host function for G2 addition on the elliptic curve bls12-381 * * @ingroup crypto - * @param op1 - a span containing the first operand G2 point in Montgemory form. - * @param op2 - a span containing the second operand G2 point in Montgemory form. - * @param[out] result - the result op1 + op2 in Montgemory form. + * @param op1 - a span containing the first operand G2 point in Montgomery form. + * @param op2 - a span containing the second operand G2 point in Montgomery form. + * @param[out] result - the result op1 + op2 in Montgomery form. * @return -1 if there was an error 0 otherwise */ int32_t bls_g2_add_mont(span op1, span op2, span result) const; @@ -1845,10 +1845,10 @@ namespace webassembly { * Host function for G1 weighted sum (multi-exponentiation) on the elliptic curve bls12-381 * * @ingroup crypto - * @param points - a span containing a list of G1 points (P0, P1, P2... Pn) in Montgemory form. + * @param points - a span containing a list of G1 points (P0, P1, P2... Pn) in Montgomery form. * @param scalars - a span containing a list of scalars (s0, s1, s2... sn). * @param n - the number of elements in the lists. - * @param[out] result - the result s0 * P0 + s1 * P1 + ... + sn * Pn in Montgemory form. + * @param[out] result - the result s0 * P0 + s1 * P1 + ... + sn * Pn in Montgomery form. * @return -1 if there was an error 0 otherwise */ int32_t bls_g1_weighted_sum_mont(span points, span scalars, const uint32_t n, span result) const; @@ -1869,10 +1869,10 @@ namespace webassembly { * Host function for G2 weighted sum (multi-exponentiation) on the elliptic curve bls12-381 * * @ingroup crypto - * @param points - a span containing a list of G2 points (P0, P1, P2... Pn) in Montgemory form. + * @param points - a span containing a list of G2 points (P0, P1, P2... Pn) in Montgomery form. * @param scalars - a span containing a list of scalars (s0, s1, s2... sn). * @param n - the number of elements in the lists. - * @param[out] result - the result s0 * P0 + s1 * P1 + ... + sn * Pn in Montgemory form. + * @param[out] result - the result s0 * P0 + s1 * P1 + ... + sn * Pn in Montgomery form. * @return -1 if there was an error 0 otherwise */ int32_t bls_g2_weighted_sum_mont(span points, span scalars, const uint32_t n, span result) const; @@ -1893,10 +1893,10 @@ namespace webassembly { * Host function to calculate the pairing of (G1, G2) pairs on the elliptic curve bls12-381 * * @ingroup crypto - * @param g1_points - a span containing a list of G1 points (P0, P1, P2... Pn) in Montgemory form. - * @param g2_points - a span containing a list of G2 points (P0, P1, P2... Pn) in Montgemory form. + * @param g1_points - a span containing a list of G1 points (P0, P1, P2... Pn) in Montgomery form. + * @param g2_points - a span containing a list of G2 points (P0, P1, P2... Pn) in Montgomery form. * @param n - the number of elements in the lists. - * @param[out] result - the result e(g1_0, g2_0) * e(g1_1, g2_1) * ... * e(g1_n, g2_n) in Montgemory form. + * @param[out] result - the result e(g1_0, g2_0) * e(g1_1, g2_1) * ... * e(g1_n, g2_n) in Montgomery form. * @return -1 if there was an error 0 otherwise */ int32_t bls_pairing_mont(span g1_points, span g2_points, const uint32_t n, span result) const; @@ -1915,8 +1915,8 @@ namespace webassembly { * Host function for mapping fp to G1 on the elliptic curve bls12-381 * * @ingroup crypto - * @param e - a span containing the field element fp to be mapped in Montgemory form. - * @param[out] result - the resulting element in G1 in Montgemory form. + * @param e - a span containing the field element fp to be mapped in Montgomery form. + * @param[out] result - the resulting element in G1 in Montgomery form. * @return -1 if there was an error 0 otherwise */ int32_t bls_g1_map_mont(span e, span result) const; @@ -1935,12 +1935,22 @@ namespace webassembly { * Host function for mapping fp2 to G2 on the elliptic curve bls12-381 * * @ingroup crypto - * @param e - a span containing the field element fp2 to be mapped in Montgemory form. - * @param[out] result - the resulting element in G2 in Montgemory form. + * @param e - a span containing the field element fp2 to be mapped in Montgomery form. + * @param[out] result - the resulting element in G2 in Montgomery form. * @return -1 if there was an error 0 otherwise */ int32_t bls_g2_map_mont(span e, span result) const; + /** + * Host function for modular reduction of 64 bytes wide scalar to a field element (fp, 48 bytes) of the elliptic curve bls12-381 + * + * @ingroup crypto + * @param s - a span containing the 64 bytes wide scalar to be reduced. + * @param[out] result - the resulting field element fp. + * @return -1 if there was an error 0 otherwise + */ + int32_t bls_fp_mod(span s, span result) const; + /** * Host function for modular reduction of 64 bytes wide scalar to a field element (fp, 48 bytes) of the elliptic curve bls12-381 * Involves Montgomery conversion on the resulting field element. @@ -1950,7 +1960,52 @@ namespace webassembly { * @param[out] result - the resulting field element fp in Montogomery form. * @return -1 if there was an error 0 otherwise */ - int32_t bls_fp_mod(span s, span result) const; + int32_t bls_fp_mod_mont(span s, span result) const; + + /** + * Host function for multiplication of field elements (fp, 48 bytes) of the elliptic curve bls12-381 + * + * @ingroup crypto + * @param op1 - a span containing the first operand fp point. + * @param op2 - a span containing the second operand fp point. + * @param[out] result - the result op1 * op2. + * @return -1 if there was an error 0 otherwise + */ + int32_t bls_fp_mul(span op1, span op2, span result) const; + + /** + * Host function for multiplication of field elements (fp, 48 bytes) of the elliptic curve bls12-381 + * Involves Montgomery conversion on the resulting field element. + * + * @ingroup crypto + * @param op1 - a span containing the first operand fp point in Montgomery form. + * @param op2 - a span containing the second operand fp point in Montgomery form. + * @param[out] result - the result op1 + op2 in Montgomery form. + * @return -1 if there was an error 0 otherwise + */ + int32_t bls_fp_mul_mont(span op1, span op2, span result) const; + + /** + * Host function for exponentiation of field elements (fp, 48 bytes) of the elliptic curve bls12-381 + * + * @ingroup crypto + * @param base - a span containing the base fp point. + * @param exp - a span containing the 64 bytes wide scalar as exponent. + * @param[out] result - the result of base to the power of exp. + * @return -1 if there was an error 0 otherwise + */ + int32_t bls_fp_exp(span base, span exp, span result) const; + + /** + * Host function for exponentiation of field elements (fp, 48 bytes) of the elliptic curve bls12-381 + * + * @ingroup crypto + * @param base - a span containing the base fp point in Montgomery form. + * @param exp - a span containing the 64 bytes wide scalar as exponent. + * @param[out] result - the result of base to the power of exp in Montgomery form. + * @return -1 if there was an error 0 otherwise + */ + int32_t bls_fp_exp_mont(span base, span exp, span result) const; // compiler builtins api void __ashlti3(legacy_ptr, uint64_t, uint64_t, uint32_t) const; diff --git a/libraries/chain/webassembly/crypto.cpp b/libraries/chain/webassembly/crypto.cpp index e4d26ed9eb..f1a41fcb4e 100644 --- a/libraries/chain/webassembly/crypto.cpp +++ b/libraries/chain/webassembly/crypto.cpp @@ -167,6 +167,45 @@ namespace { c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 288), mont); return return_code::success; } + + int32_t bls_fp_mod_impl(span s, span result, bool mont) + { + // s is scalar. + if(s.size() != 64 || result.size() != 48) + return return_code::failure; + std::array k = bls12_381::scalar::fromBytesLE<8>(std::span((const uint8_t*)s.data(), 64)); + bls12_381::fp e = bls12_381::fp::modPrime<8>(k); + e.toBytesLE(std::span((uint8_t*)result.data(), 48), mont); + return return_code::success; + } + + int32_t bls_fp_mul_impl(span op1, span op2, span result, bool mont) + { + if(op1.size() != 48 || op2.size() != 48 || result.size() != 48) + return return_code::failure; + std::optional a = bls12_381::fp::fromBytesLE(std::span((const uint8_t*)op1.data(), 48), true, mont); + std::optional b = bls12_381::fp::fromBytesLE(std::span((const uint8_t*)op2.data(), 48), true, mont); + if(!a || !b) + return return_code::failure; + bls12_381::fp c = a->multiply(*b); + c.toBytesLE(std::span((uint8_t*)result.data(), 48), mont); + return return_code::success; + } + + int32_t bls_fp_exp_impl(span base, span exp, span result, bool mont) + { + // exp is scalar. + if(base.size() != 48 || exp.size() != 64 || result.size() != 48) + return return_code::failure; + std::optional a = bls12_381::fp::fromBytesLE(std::span((const uint8_t*)base.data(), 48), true, mont); + if(!a) + return return_code::failure; + std::array b = bls12_381::scalar::fromBytesLE<8>(std::span((const uint8_t*)exp.data(), 64)); + bls12_381::fp c = a->exp<8>(b); + c.toBytesLE(std::span((uint8_t*)result.data(), 48), mont); + return return_code::success; + } + } namespace eosio { namespace chain { namespace webassembly { @@ -472,12 +511,32 @@ namespace eosio { namespace chain { namespace webassembly { int32_t interface::bls_fp_mod(span s, span result) const { - if(s.size() != 64 || result.size() != 48) - return return_code::failure; - std::array k = bls12_381::scalar::fromBytesLE<8>(std::span((const uint8_t*)s.data(), 64)); - bls12_381::fp e = bls12_381::fp::modPrime<8>(k); - e.toBytesLE(std::span((uint8_t*)result.data(), 48), true); - return return_code::success; + return bls_fp_mod_impl(s, result, false); + } + + int32_t interface::bls_fp_mod_mont(span s, span result) const + { + return bls_fp_mod_impl(s, result, true); + } + + int32_t interface::bls_fp_mul(span op1, span op2, span result) const + { + return bls_fp_mul_impl(op1, op2, result, false); + } + + int32_t interface::bls_fp_mul_mont(span op1, span op2, span result) const + { + return bls_fp_mul_impl(op1, op2, result, true); } + int32_t interface::bls_fp_exp(span base, span exp, span result) const + { + return bls_fp_exp_impl(base, exp, result, false); + } + + int32_t interface::bls_fp_exp_mont(span base, span exp, span result) const + { + return bls_fp_exp_impl(base, exp, result, true); + } + }}} // ns eosio::chain::webassembly diff --git a/libraries/chain/webassembly/runtimes/eos-vm.cpp b/libraries/chain/webassembly/runtimes/eos-vm.cpp index a0e9d30447..384d3e112f 100644 --- a/libraries/chain/webassembly/runtimes/eos-vm.cpp +++ b/libraries/chain/webassembly/runtimes/eos-vm.cpp @@ -645,6 +645,9 @@ REGISTER_CF_HOST_FUNCTION( bls_g2_weighted_sum ); REGISTER_CF_HOST_FUNCTION( bls_pairing ); REGISTER_CF_HOST_FUNCTION( bls_g1_map ); REGISTER_CF_HOST_FUNCTION( bls_g2_map ); +REGISTER_CF_HOST_FUNCTION( bls_fp_mod ); +REGISTER_CF_HOST_FUNCTION( bls_fp_mul ); +REGISTER_CF_HOST_FUNCTION( bls_fp_exp ); REGISTER_CF_HOST_FUNCTION( bls_g1_add_mont ); REGISTER_CF_HOST_FUNCTION( bls_g2_add_mont ); REGISTER_CF_HOST_FUNCTION( bls_g1_weighted_sum_mont ); @@ -652,7 +655,9 @@ REGISTER_CF_HOST_FUNCTION( bls_g2_weighted_sum_mont ); REGISTER_CF_HOST_FUNCTION( bls_pairing_mont ); REGISTER_CF_HOST_FUNCTION( bls_g1_map_mont ); REGISTER_CF_HOST_FUNCTION( bls_g2_map_mont ); -REGISTER_CF_HOST_FUNCTION( bls_fp_mod ); +REGISTER_CF_HOST_FUNCTION( bls_fp_mod_mont ); +REGISTER_CF_HOST_FUNCTION( bls_fp_mul_mont ); +REGISTER_CF_HOST_FUNCTION( bls_fp_exp_mont ); } // namespace webassembly } // namespace chain From 35f375c9b077b1d53c38cd4d2e42ba8b9df67af6 Mon Sep 17 00:00:00 2001 From: yarkin Date: Mon, 13 Nov 2023 17:07:34 +0800 Subject: [PATCH 05/24] Update unit tests. --- unittests/bls_primitives_tests.cpp | 519 +++++++++++------- .../bls_primitives_test.abi | 90 +-- .../bls_primitives_test.cpp | 38 +- .../bls_primitives_test.hpp | 20 +- .../bls_primitives_test.wasm | Bin 6239 -> 5237 bytes 5 files changed, 333 insertions(+), 334 deletions(-) diff --git a/unittests/bls_primitives_tests.cpp b/unittests/bls_primitives_tests.cpp index 71cac24697..d3628270b4 100644 --- a/unittests/bls_primitives_tests.cpp +++ b/unittests/bls_primitives_tests.cpp @@ -45,21 +45,38 @@ BOOST_AUTO_TEST_CASE( bls_testg1add ) { try { using test_add = std::tuple; const std::vector tests = { - //test (2 valid points, both on curve) - { - "160c53fd9087b35cf5ff769967fc1778c1a13b14c7954f1547e7d0f3cd6aaef040f4db21cc6eceed75fb0b9e417701127122e70cd593acba8efd18791a63228cce250757135f59dd945140502958ac51c05900ad3f8c1c0e6aa20850fc3ebc0bfdff02000000097602000cc40b00f4ebba58c7535798485f455752705358ce776dec56a2971a075c93e480fac35ef615", - "160c53fd9087b35cf5ff769967fc1778c1a13b14c7954f1547e7d0f3cd6aaef040f4db21cc6eceed75fb0b9e417701127122e70cd593acba8efd18791a63228cce250757135f59dd945140502958ac51c05900ad3f8c1c0e6aa20850fc3ebc0bfdff02000000097602000cc40b00f4ebba58c7535798485f455752705358ce776dec56a2971a075c93e480fac35ef615", - "2b90dabdf4613e10d269d70050e61bdc53c6d01ac517ad33cd8e82799d5515dfba05bc172fd280e2a73ff01aca77e30cbf82182b9005141106ef83a6d33dcda8bece738c9f9d6313f7e05945fd92c23a208efbe7a2048c6250f7f14df9f5c215e244ce19aa2759751dfb31f234c644189d4b0eae26beb2ba29a380a052b058a380b3005a7f18391cd44411a0f87d7817", - return_code::success - }, - - //test (2 invalid points, garbage output) - { - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "9bd600247dec313e88ed460013c49f7dec45c267571e241267687a35360fbee324b265772d89e38d7a886dfcf4b8eb16804724c7bf0f0e838c5795fffd6416be9fd8e9ff284548a79ae6163a8de08961c61110681a773dc976acea2cb2a8c20291e51670b204a82ff8f5ddffea2416e16ce5793251804c011309ccbda30ab8ca3efa52359820a18f39337698197cfc0f", - return_code::success - }, + { + // g1::zero() + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::success + }, + { + // g1::one() + "bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f117e1e7c5462923aa0ce48a88a244c73cd0edb3042ccb18db00f60ad0d595e0f5fce48a1d74ed309ea0f1a0aae381f4b308010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f117e1e7c5462923aa0ce48a88a244c73cd0edb3042ccb18db00f60ad0d595e0f5fce48a1d74ed309ea0f1a0aae381f4b308010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "cb6c84ef58874b297a148a7d0d8d070c305444bae71188052edcc647fe820672b44c589288a3b06f6789d417ce6f4a03a57cdfb1e1d8a42a8aa4bea182879a59bd0d6a0baf525939c92b3ebb003a09d601fce510044c603cbc026d6029b4e414c2cf8b8d52465419c8151145898e79a0db6709589631b601ec15a0ab2bc1ebf9c9153be8da613c41e34155c703e96711", + return_code::success + }, + { + "ceee6c9e1a6c228ba221ad93d4ad4d9e8833ebd4eab43c2279d466527534e693cab7d47c38fe5076527cabf553f7f0023c8fdda7c9a557ed67f00f5e763db42d32453b6c972c9730d62727ee7db1d942bd8571a15d5e7ac99c3f2638e1b05411b8a4a182986ddfe60025618808971865b1703dbca5b54534a798e75133c248b33b9865140c0f1c6ccf6c3b3848086618", + "4a3f2830b025929c35ab4ca952022d894576c83c172a2b5dcad0592de56ccb3fe0d79173ffb7d9b3a9d25dcf4690fe1022b3d371c42a40922fad5f35d1425d19754b1380e0c6ab26ce5235bb80482c6f344d0282e9fd11d63a522afdb3653b02dcb2764444c4b40cfa8dd409e6ceab3afabd6edbce62fefced034fa86bf1e9a72f71c955d23a2e8cb88e21c59d155218", + "fa9192b3dd85b569b2b3b7bd35f284b010fbd56a0e1f3fa08ec53406c237d3992888ef51c8db752d3ae401c9ad1dd80e114759044d3f0562db401fb338fa91a47d7ee4c8e113fb57b2fc42a7f595b8d49b35c897ef208ef16fd64e2dbe2db8029bdd5d6e8c565db6e1c404e47570a7a21804d3bdb2fe96411b5ab163df24e000bf8f5135a0d46e067ffa1745e89e810b", + return_code::success + }, + { + "a955a224f5bfc2e6866dbd1c09cae3f2c9e2d68f195b642e765b0ade563c877013fcf97c79746ed5e8fe7ad6928ffa15b5adc82611544ec3ad79b715a071478afb3a851bd9c8b20011b259892400527ca3de3944c46e9f3c478fa5d3f28a89118b8e8784500c6dc1cefc4fb3b0f1f809876d1d9cbabcf753ceb39f6cf4a4b5e47c04c6d04eefadf8088c07790b110310", + "f821e4f80f1e4f1d6011fbf07af24d377f7d6921b05c73ab6b6c8af8797505f3e9744f6a7c681a33e2f8815bf76aae16f975b623031db553e59e2f7d4b94721f90ea207cac7b7102fe943be6c66bd85862320c8749d9d319c4c7e077d2a5a31866e49bb81b7ec3a1a57e2d9a91efea6b22a7207ddccdaab3f3fa83d6eda3d7cc7897e56147d90cf4e1d70a9697552119", + "9b0098716589d553634f4f21e334c3aed98f173334c94d99bf731588a897e0dc2e3b7bdd9efc01f9c724ab8d192e2c0b1360a29d087c97883e69976812dfa5d4d5892f69010e3986fdbeddb157e523c9dff3e36f94b769783aa041159ab0010cae8e45de968815a07911ac36de5bebbdfb3429a043128fbe766ae621699dea970adf2881d714569ae00a4fe71c71b513", + return_code::success + }, + { + "8073cac5550abbe34caeed219fd7ad8a74cc93b89aa6a15cbe85d1bc802be24ec78009bfc80590071f62c736d42ae60ae4e59f83fade5bde522d02b5e9a3e3ba5a84f9d5112ad71db2e86a13485755ccda668c77c32bd21cc06f0268b0a2f718579c94e116c957ee7b67fac427c1d56cfdbaede897b4d430e7180d09a642788863b0dd4606ba32744494bc71f1ab6e07", + "a4e870fc30c54c92d347942768133f34b30b8776b55898ae3f1938c0fdf2697bc0cad4c26a9f2c9c7b8c1639c72a7b185db7b401867267b05c03f819fac65683664d9b3efff1b0101c799347f75b3df020f4ec23c2665a1cd1376422d1f63f044f95e3f20bda4dd0c3a541283d8df7e9e8cc1175fcf91dc2d9fba8de51710bab85c724be4aca0ca375f9eb68ace8c413", + "eca31649699faa52c0acb904f6b5ba7cdc9ea70c40b01e6169863bd74dee12eeb9f02929a4176c562c94dc9b1c68c70f67be02ec35a47c056ebb06f931cd3646dfb5e1e1d52843d7f23b62d84265e065f5ece47d182dda4b24aac8272773e906524060d7caf793152cd4c1799f638c5f7bfacbf8ccbc55b99b7c4c15b16089390ff550495c0b3d3de684ffcbd3c1bb08", + return_code::success + }, }; for(const auto& test : tests) { @@ -98,21 +115,38 @@ BOOST_AUTO_TEST_CASE( bls_testg2add ) { try { using test_add = std::tuple; const std::vector tests = { - //test (2 valid points, both on curve) - { - "100a9402a28ff2f51a96b48726fbf5b380e52a3eb593a8a1e9ae3c1a9d9994986b36631863b7676fd7bc50439291810506f6239e75c0a9a5c360cdbc9dc5a0aa067886e2187eb13b67b34185ccb61a1b478515f20eedb6c2f3ed6073092a92114a4c4960f80a734c5a9c365e1ffa7c595a630aaa6c85e6e75f490d6ee9b5efbba225eff075a9d307e5da807e8efd83005db064df92fcc0addc61142b0a27aa18a0ebe43b6aacad863aa33dc94e5c4979edca3ca4505817e7f21bde63a1c22b0bfdff02000000097602000cc40b00f4ebba58c7535798485f455752705358ce776dec56a2971a075c93e480fac35ef615000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "100a9402a28ff2f51a96b48726fbf5b380e52a3eb593a8a1e9ae3c1a9d9994986b36631863b7676fd7bc50439291810506f6239e75c0a9a5c360cdbc9dc5a0aa067886e2187eb13b67b34185ccb61a1b478515f20eedb6c2f3ed6073092a92114a4c4960f80a734c5a9c365e1ffa7c595a630aaa6c85e6e75f490d6ee9b5efbba225eff075a9d307e5da807e8efd83005db064df92fcc0addc61142b0a27aa18a0ebe43b6aacad863aa33dc94e5c4979edca3ca4505817e7f21bde63a1c22b0bfdff02000000097602000cc40b00f4ebba58c7535798485f455752705358ce776dec56a2971a075c93e480fac35ef615000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "1987cff592d8ae5c83ba9e9a1a016afd3a4e80d646e10a1274ba259b60a405c189945d07b3608d4d339a96429d60f80d8290d66f4e963c0e8c00e35db541ab46e93148fd7e41449f0be0a1883e36e4b56cf87121991d6d4778d499fdf1501c09a9220f11cdfe60560b15d7e6ec33825a8d9ce209fe8e20391d32210ba83dbd77ce4cd6019ca50465f8f5fed4a8a631048739c8d9b8fdc26a962b24f0306f8293a00d72d37fb2fb1b0643d9a8453cbf6a520463a54e25e8c42134d6798d7cce00949892c0f015e698b4386dbc3ef4f9b2b4c61454d90acdcfbf921adcd26bdf77454bdee1eb52a70fcab501fd1cfb0701ba60c9be25f9815bb9c32856144e543140d7c977d4585b0d75467b929db892f2da957948a1b02ecee537bcc742855716", - return_code::success - }, - - //test (2 invalid points, garbage output) - { - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "6084a42d13cd479f295f48a61cd03409ce2e6f646280a8b5674e2fc25adac7ad5ac5bde861a49b20adfb3c6d8bb0f0f73edf6fd4a2ad32eabfcccd59b6b73ccd94979f67a14c9d520782295a237d5221b59230433381188461d87d10a67617120be52ae01cc8d0d4ff49dd92e37991328c4caf4f089b447af0a17332a59cc1bd9e94816c44d5ef72f7ac017fd48d980282c8386dc30bd933dc455ba343d52b931009c04b631b377f3bb18465e350ee35263ee0736cec2286ec791c55becaf70d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027cb30e0640959d5f2ebc7c3e14920ae9423bbb8f998e1616b69eaeb9a6d3e0debe0fc0cc85b497b064b6d2bf756ef35", - return_code::success - }, + { + // g2::zero() + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::success + }, + { + // g2::one() + "b8bd21c1c85680d4efbb05a82603ac0b77d1e37a640b51b4023b40fad47ae4c65110c52d27050826910a8ff0b2a24a027e2b045d057dace5575d941312f14c3349507fdcbb61dab51ab62099d0d06b59654f2788a0d3ac7d609f7152602be0130128b808865493e189a2ac3bccc93a922cd16051699a426da7d3bd8caa9bfdad1a352edac6cdc98c116e7d7227d5e50cbe795ff05f07a9aaa11dec5c270d373fab992e57ab927426af63a7857e283ecb998bc22bb0d2ac32cc34a72ea0c40606010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "b8bd21c1c85680d4efbb05a82603ac0b77d1e37a640b51b4023b40fad47ae4c65110c52d27050826910a8ff0b2a24a027e2b045d057dace5575d941312f14c3349507fdcbb61dab51ab62099d0d06b59654f2788a0d3ac7d609f7152602be0130128b808865493e189a2ac3bccc93a922cd16051699a426da7d3bd8caa9bfdad1a352edac6cdc98c116e7d7227d5e50cbe795ff05f07a9aaa11dec5c270d373fab992e57ab927426af63a7857e283ecb998bc22bb0d2ac32cc34a72ea0c40606010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "37ec381f5f912b9237c11a5bdf03d40e1abd8f20bc48aac510e13fe27af89e486f39cdad8832a008895f2465dd527d17d86142dcc3d150b757bcfee5f1268e4a30244fbb153fe246df4d0d9f165f2c9002fe6398f79481d55395689e8b15f80c5fc6a7c204882a60d0690ac3920c7303d1334c4366479b2c0b08d985db9c5948d4d2f94aecd9d25fa5e8065821e95a068bb9be510e5f40a65b956239971c361c27c0bb669e418431e39a56041ae44d30aae0c0bdc702bd1c3a4b6d8a2d349c0e025070110ca926c3134559779893752459a2c1a2d23485da4ea77b195537fb5b356a5cb48d9b931923dcfae44eaacb197cf3bee0bf0e5255433bd8b94e1a6e7e56335dae5625e94c5ec74e0bfd507c963317855760a5596598694e5d40890d0c", + return_code::success + }, + { + "9fedb6819825accb2b8e5264f7751adbef3bcba87758591c12a886c03cbd6fe826c05400f81e9c19d7a2f59da2b9010e3907c8e6b13c6dfe3846af5794238ad10f6c91395b0831b6b7c5df1629248ea416fc71e170d071add93ce645226c4217d42cb9ffdd6f6aa7898401515cbd7a6e5369a0c1ca77e5bc0d92cbee10d79fc03ca30f5b7dac0c60d759a7b52c05440ab9e893411f57010fdb13b465ff73f9faa5b62d618a380772561307b43cfc1f50bc85ecf5b0efd166f6e4e07f699c7009aa69fd1bb6801e87dbe81f05f1c12622972911c675b613062bdf746f2e1b1c7365428fb9729ddaed8cbfd2661476a604cba42b1502f111b51b28aded1167a3c787f490a3fed639bdf6c3fdc25cb1b1d115b8b9c9fadfd50ea69b756834c09512", + "d12fc1796c68ef3e363cf5f54364fb7178128678a1c656df751ac4ad739bfa3561bf8b156e2da0205db3196707d41d0126462a781f7dd6e6702a0db7c8429c149f0e59d70b303faba5bd25e2e6ef4162983f9ac0ee7d47463afcceceefe4fc0a7d8ecb6d009aecca3385b94f4ce81d36e3f4c69fa25b61df1ade3d49f3e7bd84058c51ec6c5f64b17f0d05db1af00d035f459a2c03bf6ac36a04dc80a3104ad5bca50b2920ddb16b96edc8513e1bb3c8bcd09cb2f9ae714579a14ca4ae4560089715b8b2a2f4283b0b9c0a3c686461d272e8b04ef21cd14766b9fbd6dfd61f59554c06ae52324d38f35b6e105dc94d0956a599c460bbc5ecf4c109a3e486e91ee553229818def0797e7b01f1ac861ce31b252cf4138b1195c0464fdefb286608", + "034695efb9c8cafe81689d14ecc8e65623ea5020a07233ef095f84c07a42b8342661f9c872d98cdf41c75b08320aa41977198b14076b663a62a89f041afc1bffb5d2276060858cd2bcd8e004d33d935ea0fc4f823636c01da91a166e11126213f5dfbe35591acaabab64bb66124d28326a244b353730ce6ac05d940638ba14863e6e4c30b6d7eca128a53bcb5c648d173de15832746a29e4f0e4ad34b881bb08e0f9d2990bbc72c9bc6df1228e6e741ee1c59b2b7333594f0288806254b8c10c0352c80b6801b410ff9081a7041f4687e566ea7c4b29b9ffcf6dbd7a2c1fa7eaa65d912d84bd0b07453c5e1d8cdecf0afca9e3aec688e47dbbe43ea813476066181563481aa38cf25caa279f9700d7f79178f01c3e07cda32ffc4e01ea7c5803", + return_code::success + }, + { + "7292b7047be950cb98766c6726dfe97f0cfd616dba460520db5baa542049dd0e864fcbb6c6c9081dd6d14fd80b71b91408e5b018076af52d9f581e3313a8314d3e28344dfe259924c999982ea7c5c99ae48a70123bc2aeccffb513124e86010309774bc4d5679f59114f2a8531ff0006315e4ff68429968647a22d40f6ee4711001324e966430a64a435691f69debc0e598d7a5ca0030bee06b92dac3f11bd0ba911fb660f065c53dabb529f879105face9cedab83c3707f0426c6bdc795d20e5529dba50a5831120ea15a003206cc09afea4407e76bc6e52b99585dfa2a420df52ca24ff34024bced3f0d0a6a16be17365152232b159c9cc7f8e84572780dfcce90fadfcba26337832b9c9da40872feddbde8d34af44eb64fce79f0c93c4e18", + "6f389fffc75894538a6a529598c055b75b175ad4a987b7d2fd3559a96428edc1928e385175d31d0bdeadef15d6a86a0c2582893e61087ecf6bf2d93203d84b827da17ec5e415c20f81ada4835f50a12a28ee66173c06daac6c84ab052b725f192edd1105a5ed8761562492b04f1b73fa6ffcdb90c0545b93b3fc53575c9f523339828a2f155b1db7351d3f8665d83117450ee4c958940a8b7b916a98238d11e0d9281e8b7b48f1de3ad708de80dddeab0b164b1b932db9faa547ea600e9df105ab7611d2831139810ee3f7e2ee267978fd4c9fd8798b4384b49dd2b83e32607814b558697368ee4b133898dc0465f304b34e064ebd8d1dbc068d353a133bdaa583d494a1c7a0c2286e2c7aeaf4f1017ad93342b3e1c1dc9039b29ae3bec2e210", + "01b6280399256c33068a03316de8793f0b3b7b821440d0eae89698f1bf3ac6339b1bc4d926ec46b3e69e2dbb01ab41155cf70c836d595e3a1f316cc4bda8964c6a1918fb53d8f3086c0d7a557b3ccbe6cfdbdf240646b8b0ebf9e5cd284f4d00c31f1beedc5441afcbe931f7b588bff2d47383c4459aa05f2e0a1f47a128ab8fa21ade44d77d69448241c35cec0b09030b9c999b9c3ee3b12760c4191b533ed002b131d64774562a61dcdd942d6d192790fa3c9ab9c2799a706bc4b8e4489c0f0792f6014ecc421bff98c14510ecd254b1366c899f38b9fe5fe272645cd8afa820540bcd96825218b5f605f0cea2e40f81d6f59144bd82e2bfef4f9439d2dc8c283bc5e49688e62d0d27470c92584572bb676ce1973e870c4a2d528267730f16", + return_code::success + }, + { + "7998f27e2ae8577e9f03dfbf5979edc189e4499df4046b256ce4dab0ed9b71e6617e894fb40d0ac15d166f2e28a75e11fad87fe49585b3ebd75e2efeae7b9987595308fd4238d917d3281ca751b2efbfccbb0c261f28e3696815270fc6f6b00addf860b1a7e863edb17e45991cbb25665a22e9a40e3fcd58aa875b1fccd4d2db3c446dd731ceac57e7bd0f74d2c40b091127ccdd7bebf2f5048d193b451d8a145896bf48b4c053ff99ff1e69d47dcd7b0d98e9d40e89b00cbbf99377d63e5e1887c76b8d82e7843e25bb6bbd16eabc1c17ba0c0adfe0599f8aac7519e2b78df1085eaa33c088b4318e84d49f5fe9f50cee60174fe4ef7cdd24658f84ce3ad6d08e65050d28df66fca6139c8fab230147af1820d50fdb1804dd6f01290a395811", + "91462e5b83b18c62a78492b10e4c4240118400398c85a07fe7c1ffc4d78cf3a6dffe717a4c05331cee49273a1350a71714f0dc231a91d3d687e65416ef070932285facf8a13c26d9311cac3a494179facf6b623951ee749da29b32cd39ad4500d94ad0c0b4bdc8346c4ea9ae497b09b31e356f75368249bac0c49e6dbd20eaaedec624ad8971691382e44fb00bfbab00eff738c3e8ccf3b0c3295d49adec69a1821a38c7ad8b06ca87c66ecd63fb352f1b254bb1dfcefb46a56a3ebfbb745a08fae66f083c8cc37d379cf8022ea3c87a6aeb747d38f7405e04be72fbec8c99e5475321ef4adf3219caddfd4d2558b013eb05f346b180876b4886bafb43d29b0d4cf99fa76e49184818fd26570f5bf98c53f9266ba24803822e6abb3996690402", + "271c51bbab23e74a87512782b502e2045745719850222b88b3e74c2827d7e157178b8221f95e81e0b33c37eae451720b2602fb54f74fd0e9616c23ed01b700cb1635eec16182d83fde3063c505d1165a2e9324eb83a6f664cd75b5aca1bc9a0d6d2f0c65e6747b83e98a781fe4172e73d65ff02f76ccf6d3a3a888fb7a745bf036be4124d4d4788829ea96d4131bd70114eeca364293d4242d9194e71a6d3d51e3ff533df81f92bf1ff1961f0ece0243c1daed01e9a7effbd08c7abea2629b13b0de9223b4b163eefff5442d37175e05d4d0116a497e4cedc01adde05399a875bb194606bbe8ca6eb191a456941bd51353f9cc531690aeb77be5a6b251cda55bbea3adf833ef4d5290226f82a8e7c272730aeeac68ad55f0001d2123848b910d", + return_code::success + }, }; for(const auto& test : tests) { @@ -131,113 +165,7 @@ BOOST_AUTO_TEST_CASE( bls_testg2add ) { try { } FC_LOG_AND_RETHROW() } -BOOST_AUTO_TEST_CASE( bls_testg1mul ) { try { - tester c( setup_policy::preactivate_feature_and_new_bios ); - - const auto& tester1_account = account_name("tester1"); - c.create_accounts( {tester1_account} ); - c.produce_block(); - - const auto& pfm = c.control->get_protocol_feature_manager(); - const auto& d = pfm.get_builtin_digest( builtin_protocol_feature_t::bls_primitives ); - BOOST_REQUIRE( d ); - - c.preactivate_protocol_features( {*d} ); - c.produce_block(); - - c.set_code( tester1_account, test_contracts::bls_primitives_test_wasm() ); - c.set_abi( tester1_account, test_contracts::bls_primitives_test_abi().data() ); - c.produce_block(); - - using test_add = std::tuple; - const std::vector tests = { - //test (valid point, on curve) - { - "160c53fd9087b35cf5ff769967fc1778c1a13b14c7954f1547e7d0f3cd6aaef040f4db21cc6eceed75fb0b9e417701127122e70cd593acba8efd18791a63228cce250757135f59dd945140502958ac51c05900ad3f8c1c0e6aa20850fc3ebc0bfdff02000000097602000cc40b00f4ebba58c7535798485f455752705358ce776dec56a2971a075c93e480fac35ef615", - "2a000000000000002a000000000000002a000000000000002a00000000000000", - "de3e7eeee055abe12a480e58411508d51a356ff6692b14b43426d22cc354cd5d7469c41e0f1f5e40503c91e11419a30285cb057a62c93e2caaaff6c9c1dbc8f88c0a122157f51a617ce0e2890442cd9ce004a8ba972442e61bce9dabf1c6780c191984ae3c11ef21884a536f0d3450974df37295e9579d16cdb8dfdf9252091ca3cd9d05f4c6e645535add05ac197b08", - return_code::success - }, - - //test (invalid point, garbage output) - { - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "2a000000000000002a000000000000002a000000000000002a00000000000000", - "759c3833cb6907e6f1a7fdd6a9c748957498bb8d0282cc641e6020bb18e070170140a4206477882e42a8b551dafe5d11a7e67cff45922bf2a49eea6d64fc5fecb26445170a6ec62233235cc2ac22bbecbf3271cf44f7a59ea0861376b7fe3f130b1865a3ee0d7f5a4bf360b6135c227f46644421caefe01ba82390a8756b7248e24ac4f89c94de92c385abfd6e8fbb11", - return_code::success - }, - }; - - for(const auto& test : tests) { - auto point = hex2bin(std::get<0>(test)); - auto scalar = hex2bin(std::get<1>(test)); - auto expected_result = hex2bin(std::get<2>(test)); - auto expected_error = std::get<3>(test); - - c.push_action( tester1_account, "testg1mul"_n, tester1_account, mutable_variant_object() - ("point", point) - ("scalar", scalar) - ("res", expected_result) - ("expected_error", expected_error) - ); - } - -} FC_LOG_AND_RETHROW() } - -BOOST_AUTO_TEST_CASE( bls_testg2mul ) { try { - tester c( setup_policy::preactivate_feature_and_new_bios ); - - const auto& tester1_account = account_name("tester1"); - c.create_accounts( {tester1_account} ); - c.produce_block(); - - const auto& pfm = c.control->get_protocol_feature_manager(); - const auto& d = pfm.get_builtin_digest( builtin_protocol_feature_t::bls_primitives ); - BOOST_REQUIRE( d ); - - c.preactivate_protocol_features( {*d} ); - c.produce_block(); - - c.set_code( tester1_account, test_contracts::bls_primitives_test_wasm() ); - c.set_abi( tester1_account, test_contracts::bls_primitives_test_abi().data() ); - c.produce_block(); - - using test_add = std::tuple; - const std::vector tests = { - //test (valid point, on curve) - { - "100a9402a28ff2f51a96b48726fbf5b380e52a3eb593a8a1e9ae3c1a9d9994986b36631863b7676fd7bc50439291810506f6239e75c0a9a5c360cdbc9dc5a0aa067886e2187eb13b67b34185ccb61a1b478515f20eedb6c2f3ed6073092a92114a4c4960f80a734c5a9c365e1ffa7c595a630aaa6c85e6e75f490d6ee9b5efbba225eff075a9d307e5da807e8efd83005db064df92fcc0addc61142b0a27aa18a0ebe43b6aacad863aa33dc94e5c4979edca3ca4505817e7f21bde63a1c22b0bfdff02000000097602000cc40b00f4ebba58c7535798485f455752705358ce776dec56a2971a075c93e480fac35ef615000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "2a000000000000002a000000000000002a000000000000002a00000000000000", - "aa25f3f539b6f3215318d81b22d14bf9108294790e8a50545a404ae2057278304d8c3b5844271202b757767d1555a106ede90a9967cdc27b527d4a5720efda79a68b17072ad9402ed373ce9a2d28f5496106fc4cd23234b083181e8325734417f8330d2ced14040b815a006f7f905361f654d483c45abb90b4a958b4ca20ee2bb97cc1c9b6ff45644539abb32149610f33858c88450dad3d2adb82df72f9ed9c42dc2ef78e17f5a2a1abd0468853d55f05f6458179fdf5671db784795a686c0ffae139afaed0212d18d615b0ff90a9deba090f723190521dc8c822621b0a7e70a03b9f3faaeb862846dccd418855d70406fc57e73783c2da92433c1a3873640217539ec7c01f3d354506d86db49fddad225e82421506d99c19b749170aa4f805", - return_code::success - }, - - //test (invalid point, garbage output) - { - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "2a000000000000002a000000000000002a000000000000002a00000000000000", - "50b11bda450431471dc45148066c514489bdc886a8353f382ea4992279d5f01ecec4b1b2782cdc2546cbf6bc070e3701123658149032e1f3af1e63a5ad402549900a42698de7064c9eb7a1b9a344b709073cf033649c01ac6249ab26909b1d194a8d4379563b2ed355b4b63047fc6c0ea9e9b99f75f474db88cee948733dbfd7ddf175d3e67badbce68e3b8515b8e504e666696422b760a10821a881e01d9249ba388eb86f5e8698ebf5cef4454c39144d89b050611a94685ce4505a19422009ef420ad74837caee3ad9a0128c8969e30c130ecbe76ca7157cb12fe59979b777a4df8411519e3137269a05866bd12b1964cc1e6474ea7555e03215a61b2997af51847b27c00fcda059b18be464d51ad8866ce243ca826a184ea25b03d0f9c10b", - return_code::success - }, - }; - - for(const auto& test : tests) { - auto point = hex2bin(std::get<0>(test)); - auto scalar = hex2bin(std::get<1>(test)); - auto expected_result = hex2bin(std::get<2>(test)); - auto expected_error = std::get<3>(test); - - c.push_action( tester1_account, "testg2mul"_n, tester1_account, mutable_variant_object() - ("point", point) - ("scalar", scalar) - ("res", expected_result) - ("expected_error", expected_error) - ); - } - -} FC_LOG_AND_RETHROW() } - -BOOST_AUTO_TEST_CASE( bls_testg1exp ) { try { +BOOST_AUTO_TEST_CASE( bls_testg1weightedsum ) { try { tester c( setup_policy::preactivate_feature_and_new_bios ); const auto& tester1_account = account_name("tester1"); @@ -257,23 +185,76 @@ BOOST_AUTO_TEST_CASE( bls_testg1exp ) { try { using test_add = std::tuple; const std::vector tests = { - //test (two valid points, on curve) - { - "160c53fd9087b35cf5ff769967fc1778c1a13b14c7954f1547e7d0f3cd6aaef040f4db21cc6eceed75fb0b9e417701127122e70cd593acba8efd18791a63228cce250757135f59dd945140502958ac51c05900ad3f8c1c0e6aa20850fc3ebc0bfdff02000000097602000cc40b00f4ebba58c7535798485f455752705358ce776dec56a2971a075c93e480fac35ef615160c53fd9087b35cf5ff769967fc1778c1a13b14c7954f1547e7d0f3cd6aaef040f4db21cc6eceed75fb0b9e417701127122e70cd593acba8efd18791a63228cce250757135f59dd945140502958ac51c05900ad3f8c1c0e6aa20850fc3ebc0bfdff02000000097602000cc40b00f4ebba58c7535798485f455752705358ce776dec56a2971a075c93e480fac35ef615", - "2a000000000000002a000000000000002a000000000000002a000000000000002a000000000000002a000000000000002a000000000000002a00000000000000", - 2, - "9e80ed609e62978a3a7f0d6bf57e1df4070725c1bf4dab43a6b710adef7450fb41f0cf14a7895ec26fd8c830c327cc0e2c8fe7687d23ff84647b47bbad04cf77625dee1049e53ad5162fe772278e5fe3ceb0bdc472f31952343da7b75532f7016613af892092131ad77d13afc8c9192487ac19f8454ad932653145f06e25790d26b23ac6b83025326f3397efbd845511", - return_code::success - }, - - //test (two invalid points, garbage output) - { - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "2a000000000000002a000000000000002a000000000000002a000000000000002a000000000000002a000000000000002a000000000000002a00000000000000", - 2, - "a4a01d651d82bd2e4f6f0df09b5f57254f2fb3294a83dddda170312f752c6107511739d935d6e5cf9f5ab245ff29b3057c41e220165e0a104493ead21fa8fee939026a77c031ba9f27edeb233375a2172f8cb0fae434365f6a65e1677ef72f00018da74a79be5f8e856f58b7b57f01cce6e1c082309a00612992714c5aed692dd8dba9061dfd04fb8e9dd61acaf3620f", - return_code::success - }, + { + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + 1, + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::success + }, + { + "bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f117e1e7c5462923aa0ce48a88a244c73cd0edb3042ccb18db00f60ad0d595e0f5fce48a1d74ed309ea0f1a0aae381f4b308010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + 1, + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::success + }, + { + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0100000000000000000000000000000000000000000000000000000000000000", + 1, + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::success + }, + { + "bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f117e1e7c5462923aa0ce48a88a244c73cd0edb3042ccb18db00f60ad0d595e0f5fce48a1d74ed309ea0f1a0aae381f4b308010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0100000000000000000000000000000000000000000000000000000000000000", + 1, + "bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f117e1e7c5462923aa0ce48a88a244c73cd0edb3042ccb18db00f60ad0d595e0f5fce48a1d74ed309ea0f1a0aae381f4b308010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::success + }, + { + "56fb700d759b661cffa9e350aec51d590585e0ceaa8c1a6307bb3f4b5f9f6c99876bc0438c0855b9b6556acae04c0900b7a7690c60bfabc1fa082f5bb22bda7388bd3a14b55ff2c76587dc853a14585aa5216fdbe248b70b9219e3006ffc5a1561c571dfe71a8e423551253bad43d887b5bf3a93956c6ef1bdeebea6bdde14b947c402383784c57178fc83d9f2dc240e", + "bfe41699bd50b1461f6adef26ec1ac3116abd97b42b9bf0d44aacae55ebbb771", + 1, + "51e0871837ce0f9c72f1f0af031c7b9624ab8b6517fb012829c99fa0ed145bdcb01fa238d63811f0648eed778cb2cf174e439855eb15ac53e6b1c4064f34c4e538e5a066e6da61edbb44915af9294b51ec8bb286403b027158fe8b6603edce0e7dc24dc0912e3af82f1c9167827678ed5ec4180293b9edef01d8b9d6f64ef1a2a4afc9173f3767f5c71f109dba234602", + return_code::success + }, + { + "56bcd8ea8d9addbe64cc09200e5d562a892a772c019cab467f0ef941a279ba13be847f1284190419ef4dd0ccb7846b15cdbdc2302cc83fa9bd13e782850b4273b3c077d2daf86e385691d96b878343862bba44d61406f2be3516077bd344930b18f61d751a8745ed6dbef9f964430b35d4c984d77d136d84c5406a9970a92d70629116af1305f983cdedfd13931d1c0e", + "3a8e9a6c80c65b79ea9b84344e8e4f3bd709224c3eb2d528313cdd73427d5a37", + 1, + "9e0fbffaa16ab6c0f8dff313e8762cfb969da49064c9e5e1fed51138d6ac994d9e925d34d85f43819a9542a614724d104c7063e4e4d964c7c45ee327499b0f16ccfb851fbddd6e1ac3149881e526ba592528dabb7608be4c4c2fb0807344130824d348b88b72e4e5032eee3e20bf07096a414e19f701a8aa0744d005a8fc686ccae172ed6c09842c49f37c3f5e9bdb17", + return_code::success + }, + { + "a6ab6ade9e58a67857fcf69bcff210e9b40369144f7dcaf00dc46c43f7ab7e0f233d8469279daf1a97b20e5b817d6108a9cd276fa9e6bf6d2112066a91658de928a971396835782096e9c1cd75c3c0a2a917e433f2ea36a5a1edd5a22c0d390b635fab99620b983e87340a8238307608a7c5221d6760ac3122c4b1710555b3d5eb4b15b1a43e238b8e85e9e885c6ae13", + "4efd4bec47d91858f9328b5000e5d4028011a5b9f94ed8106541878bf1976245", + 1, + "7671e871c42d00b72a9a2cd3cd518c9e9c7d75ed889787287ce5e3e2b4716474e9975de5f0431aa06aac2168fa9e38114b8cdad6cef8e88a319bd0a982896e392737775b5114250e4fabf180351433a75bc33497f514be84e437f38bcef4b6164e1bbf94a16397a17ce96861bccdcc5b538fec20b53fbe35c6f48853d3ea10e22c656c53c4e15a0ac638f74f59f50b0f", + return_code::success + }, + { + "dcb618d46f80506aa4c8b76ccf68a02e3ee3d026e49f6af27c137e642a913c194348fd4b3b5e820de212e18adfa0d20df96e68b55c29b475b723b1312f63b8aa0aee12b43401daae8feb9cf4004c8ffe373804b38f62f874d5ce4cdcef27fd0ed652d3e187165f3ed4a440f9c51b336b5968a7e91d16cd01bd360c318c1d54bf67d1221b2ab135f809df3a7778eb0011ab2c896d7cfb17c5db7095355e4540a422c298db6ce1dd85f2f3482408747148bae2dbadb5c92421473c7700e3b34b05e32d691d3c66c243926ec8b73c62af21678fa25eb724e50b5e5056215c0db74ee65bdcefef95b79d55419d1ac65ca704062464c6bb4e8ab5b386f4c7878d2c28b382b6a16eeb2a4efa9a69c70b652e6912f9524e679291c82c5f17f511551416ced99e93d6990082ada3f6857430bf36ec3ff672a21352d6d45072298097ec67b67ffecd48bed86cb800d6aea9d83e049cc3a6b09624f22cc5e2d130214e6a6ab846de8f5cece965415a41a955a1b4c694dad48571812e9dc099b5157298d9139dc267eac3e1d1390c6630dc870b6e684a2fa76469a8f5ec129552386f4a1cba1bbbdcbb82ae516f77bb2f78b82463182accfb2d4b291a4aab60e58d88d3dc7adc575564bcb5de03bf475b37701b27c55b6dd829409564b521680fbee3edf41102e2d16d423925870e3a348de97a998ecc393a25db64a89651a2b86d61a09498b1433a5fd7d267b55a43f77c3030760803ee7f6fe2de530e982ca0d4a1d929ebc21fee5d72a8e77d428c01dbaf611acc3f5baf3478bd458c78e167a5a2ac6a18", + "eb4838b85a7fb1915604457d07dca331d081c4e960e15b1c9e264c26370dd22ffafdef177ccb0521114742e579df2b392d26259622de6f13f8f4b8ea8d608305dee0d12642aea8997d76df5bd95872412cac12e313357c07c4f0c561526b525eef1980734b6a920f312042b58a84de104d1543c1f03c36266b389a58ea969116", + 4, + "ffc9085ff3eeae99e94cc295baf1015167b938947e030accbb0530cd83d968e04a7331ee358550385be31015c44ae40236aad3e318831af99df4df46aeda1234ee334b10a4132e1edb4d4405e943ad051a67677af79b6c4152d3189c68a6880639ee15e8dcb151b479dccf7d5fe20f697195f7d724ccebfd8d95105bc047b5fa8a65c816946634d2472d745ac2cec902", + return_code::success + }, + { + "4d06a8c835228a3176bc957ed6b5133efc08335cb45cb6e6ca10f62465718c85ce90002880588bd97914b6900cb62f07897722ec89f1ed966150c6be9791d2d45668c0fca36d3ec396c0b2d13287e9757a0e32bc70ed761ea9d4f3acf8769f126c91af6d593bfa8d04b2932a119d247277d4b2525ba94375f066f523c907fc016d555cbe4012477016bc4d434144411686e3596064845305fd8528d5d3717eca505b970bf933d3940d6a29a8afd35d257b014a15aed0b63de3450035f548ab04ec8394201ff8d4bd92d73c9f4d548dbbf9998b153453410e8214032a4f47282a511b99a6435c8a658987be5c84c35603381c5e2827425173da2b54ec8a1efc171a65adb910217e61731722a79b40acde67c1425d5dafa2edee49522afb26c40200d18e138a6da3388bddd5463d2521eeb2c9eaeebb6fc0c63affc2b1b7cc678d7eee2891b74fe7ad3e620a24f5bbc215ae1b2584bcc71946e4bcc00e8a91508f331d15b19c9f50561e077606e8c56706f6bb98eabc2a63c96293a83472b3b005690965bcda3acd44f82b654d5caca9c521f93113badbafe5fb50f51ddddd40f1c262862192c5d147ebc2b82b771e4d179e46a84a1d31e9f219c877f6dd77b3a784f7df5463d042304d6e889d8acd8003fc9e89ac96b48f561bd15eca654eb111a94ec406881b6fa331fe61cfbec2fb2322bcb8ac7c5ac7136ac1a811363faa6a37a16aa2a6728e4094ee6d2a395fd509663b700cbef78b70c37ed463aaccad738755334bd631889a04310d666cb3f7db670e3142457c952183501cc7a8f32419", + "eab5f9ee6fb7201cfad81ab70971aa2aa4f0adcbc23a21215a7fed3dc19474704157455231dd4772a632c259c79fa22ecb94480689b5f6251a6b4fb69d29b12cc6bd2ba85ba90c945af4679cf4989b30fd0b89335c68971d86390c2af5935726e79f59dad66f0d2c0262469c26c1bc02e5c4c9a41afdde3274f96637523db65d", + 4, + "8cb62ec44e75e49f6d5e2dc2bfc4bd5e472258cd157050d110b73d71880153f5aa56f82421575be902ea4c2f76b6d301a56384b237465fc44ac3a75e60448894bcc946c5700dfc516acf5472de583f2e662cf941f12f509895a762dc034f980d415b35f0fad0ddf3d1ccb98e887b1b3c1722e31fad62f53dbfc844899a7ae44369154b109ac03a258da7bd71773fce19", + return_code::success + }, + { + "20d1735dcc2d5d41c216c4454a1eb76f1356cdb8db2ee5d20cac5664b7193786b69afbefe9acb627a601ce4a41e0341642a975aedfd479e5fc395bfed5e6f59977ccb721fea6f27e41d494d8f6a570b3e771102f963282d53e4fe0077cefb505a6727dc3ab58f011eb3e28f8333d8f679e8f99077ca57d1f4eeb9655f91c8364d09c1cbf04bd38464c3101478a7b820015ff304b751a4928160dc69d3a54619c35206808e03fa205b83a29ff4dffbed65031fe49a9adda364c029c59c105a518517e780fc252a7e2b55930dccf9553d6952364cd93ee3de6efd2ae3a29bd4909d41b20e628706ec03fc014f2e14b670c0091140201f70bc8dc4282ab700bacd77a4303158a74583776d0ea6efb3fe60c7daa4b684ab0ddd88bcbdb3357a6db06d63612d32b131f84aaf04579342f70d8b469ea6a37b31ca859d8ce65ae3ff9f1220cd53e0dcf48e45155c47ff793080f87eba9dd36e82ceab065f5a80d68118c77493735dd1fa5e18bc046c692038509f4e05116e1e2627cc886e1296f81f8030eb2be70d61acf208fb9d294840cc31e7d44a4944e8dfa60a29ce0521f557f80018bf2adece6fb22d4ee5dbd39f9cc14ed384b5382c2e288b5454e16932b79eba69085bf978aa1e3c0a9a1fcf85643152910c5fc9bc8e79b89246563f19f2e1901aaa41b3d6b93a599ad88d7050ef7f6f01ff75fa94e46969e1175dcfec3e586a409b2230b4ea60cb1d512d98483c61984aec7c14117c471d62de392dc7ff6373cc01ad7a3542607889ad4a83a3cde18abca6fe37f228e52d61af48d0dc22510", + "ce6d7b7ed8e3ff3e93d51ea53e8ea94872c2a2f684175501566e651c2b037b0f49b2d0b4d2a5ce031fa917b393b64a2196fd6701d071662077d8bf8d0d5acc5f1c68c234ca67dd0ebd3777753c3cad1b7550b3d9b462630eb9b5e1f6061206466eba81651bf5959bacfd314f958b02430fda49d060dede0b1e328f916ebd0462", + 4, + "42068b82d2fad3172e12b1ab84d2453521a1fa1471ab898fa61805aa8e3df69606e0868af1ae00da3b4498c835857f10e1132fd7e787a67bc6487e4a96f1ab0d3b6a7211cd92e8c12dc0870cb07aa5a545369644bd27d0a934c3f68cd5b89014e2c7d32789b8618b7e8747fb2cb1534f16987395ed79f6c683365d9978338a0f7edff04133175859f1081d126a818a06", + return_code::success + }, }; for(const auto& test : tests) { @@ -283,7 +264,7 @@ BOOST_AUTO_TEST_CASE( bls_testg1exp ) { try { auto expected_result = hex2bin(std::get<3>(test)); auto expected_error = std::get<4>(test); - c.push_action( tester1_account, "testg1exp"_n, tester1_account, mutable_variant_object() + c.push_action( tester1_account, "testg1wsum"_n, tester1_account, mutable_variant_object() ("points", points) ("scalars", scalars) ("num", num) @@ -294,7 +275,7 @@ BOOST_AUTO_TEST_CASE( bls_testg1exp ) { try { } FC_LOG_AND_RETHROW() } -BOOST_AUTO_TEST_CASE( bls_testg2exp ) { try { +BOOST_AUTO_TEST_CASE( bls_testg2weightedsum ) { try { tester c( setup_policy::preactivate_feature_and_new_bios ); const auto& tester1_account = account_name("tester1"); @@ -314,23 +295,76 @@ BOOST_AUTO_TEST_CASE( bls_testg2exp ) { try { using test_add = std::tuple; const std::vector tests = { - //test (two valid points, on curve) - { - "100a9402a28ff2f51a96b48726fbf5b380e52a3eb593a8a1e9ae3c1a9d9994986b36631863b7676fd7bc50439291810506f6239e75c0a9a5c360cdbc9dc5a0aa067886e2187eb13b67b34185ccb61a1b478515f20eedb6c2f3ed6073092a92114a4c4960f80a734c5a9c365e1ffa7c595a630aaa6c85e6e75f490d6ee9b5efbba225eff075a9d307e5da807e8efd83005db064df92fcc0addc61142b0a27aa18a0ebe43b6aacad863aa33dc94e5c4979edca3ca4505817e7f21bde63a1c22b0bfdff02000000097602000cc40b00f4ebba58c7535798485f455752705358ce776dec56a2971a075c93e480fac35ef615000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100a9402a28ff2f51a96b48726fbf5b380e52a3eb593a8a1e9ae3c1a9d9994986b36631863b7676fd7bc50439291810506f6239e75c0a9a5c360cdbc9dc5a0aa067886e2187eb13b67b34185ccb61a1b478515f20eedb6c2f3ed6073092a92114a4c4960f80a734c5a9c365e1ffa7c595a630aaa6c85e6e75f490d6ee9b5efbba225eff075a9d307e5da807e8efd83005db064df92fcc0addc61142b0a27aa18a0ebe43b6aacad863aa33dc94e5c4979edca3ca4505817e7f21bde63a1c22b0bfdff02000000097602000cc40b00f4ebba58c7535798485f455752705358ce776dec56a2971a075c93e480fac35ef615000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "2a000000000000002a000000000000002a000000000000002a000000000000002a000000000000002a000000000000002a000000000000002a00000000000000", - 2, - "595a2cbaa4315ecc0dd9838a81712e0cfb88cb2c4468640ff382abb321b3a9bedebb0aad985a9057f664fc52eb52cd194b1c9611b25ef4281e439a52d1832813decd66c22440821f0288dcb7a82151386aa0240e943b6905e61619be2e11c208fa03df16e11a1b1368abac90598bb237f785701d5d1d5cb0af6934ed633d366de28703431b8d70899d92797689207c0cd35c345460f971dff5d648d9ddec8f5fabef99b15ea7c4440ac1564d6e0326076f32a4ec9cf0d10059593d64afd35c03d10f16794821628b565c9319f4af3c96b98c4fb11bc0c04172bb57372531f6e76798142d4b00488adbea850a2649a305b71fa389c3c226f2df4a58c8bce5d90698452f4126046be0c82d8817b64162a53787f1cb73af27d969adc626c1392716", - return_code::success - }, - - //test (two invalid points, garbage output) - { - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "2a000000000000002a000000000000002a000000000000002a000000000000002a000000000000002a000000000000002a000000000000002a00000000000000", - 2, - "71aa03189998d6bec41f070fe01d38efc3b60e77b6dd7a7676b3f0b8939e2fda916c4609b5d3313e04c382107aac7f014f65cf46d614729fc4255e6e045a1a13e851a81a2f03036973b211ac18152231e24d93805f4b64792d573f490791c20d451af61e3081a4b8f40919969a87bd015363da93d1b7f1ff4c625dae5fa6c95492fefb689e66a10a8d5e9f3d0190e9119e6c11550ac6a09c6ded21e9d67c0ba1e71bcc4ef28879a4d3af1beaf0a9394b7a01c28bd01d0b09818bb8274a275e11d0a3859c637c455a28eef74d4ba33e7a9f0550ef58e5f0e960a4c29b2800ed1697408c7331b198efcd5eda01705640118ef8a64c4e8eb7c5397b9d6e0d8799935be4e973ada583bddf13f2c17129f6ae60f0ec4f39971af53bc154c953312419", - return_code::success - }, + { + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + 1, + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::success + }, + { + "b8bd21c1c85680d4efbb05a82603ac0b77d1e37a640b51b4023b40fad47ae4c65110c52d27050826910a8ff0b2a24a027e2b045d057dace5575d941312f14c3349507fdcbb61dab51ab62099d0d06b59654f2788a0d3ac7d609f7152602be0130128b808865493e189a2ac3bccc93a922cd16051699a426da7d3bd8caa9bfdad1a352edac6cdc98c116e7d7227d5e50cbe795ff05f07a9aaa11dec5c270d373fab992e57ab927426af63a7857e283ecb998bc22bb0d2ac32cc34a72ea0c40606010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + 1, + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::success + }, + { + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0100000000000000000000000000000000000000000000000000000000000000", + 1, + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::success + }, + { + "b8bd21c1c85680d4efbb05a82603ac0b77d1e37a640b51b4023b40fad47ae4c65110c52d27050826910a8ff0b2a24a027e2b045d057dace5575d941312f14c3349507fdcbb61dab51ab62099d0d06b59654f2788a0d3ac7d609f7152602be0130128b808865493e189a2ac3bccc93a922cd16051699a426da7d3bd8caa9bfdad1a352edac6cdc98c116e7d7227d5e50cbe795ff05f07a9aaa11dec5c270d373fab992e57ab927426af63a7857e283ecb998bc22bb0d2ac32cc34a72ea0c40606010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0100000000000000000000000000000000000000000000000000000000000000", + 1, + "b8bd21c1c85680d4efbb05a82603ac0b77d1e37a640b51b4023b40fad47ae4c65110c52d27050826910a8ff0b2a24a027e2b045d057dace5575d941312f14c3349507fdcbb61dab51ab62099d0d06b59654f2788a0d3ac7d609f7152602be0130128b808865493e189a2ac3bccc93a922cd16051699a426da7d3bd8caa9bfdad1a352edac6cdc98c116e7d7227d5e50cbe795ff05f07a9aaa11dec5c270d373fab992e57ab927426af63a7857e283ecb998bc22bb0d2ac32cc34a72ea0c40606010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::success + }, + { + "5adac0df5e3a282dc813364ca18c028415b95dd9df9ac2f860d0fea01ce55f0a333269a9fc54a33f65b8f4eaf4141a16cc266f7338ce5173fdb1360694781d56125d1f68e343f59261d085de3b80e476d7e9270ad17890191f7d4f4160a49f03960b00664c707cfb02239df75d2c416b5c68b4d9774ddabb97dc0376a0b33d8a9a1cf9b96481cc88dab9ff9dff50920cf5d21c888bd669557ca8df124a946a30e29dca2225186ed7373672cae29b7902bec47f4672347c24c604bc033c92320bede4ffdacb11db324f51b6bdff7427e36914e9e80e5743a7f63cf9129b3eae2d645b04a3540621f44e987b6381e07f17bbf46da4c8a39a1c6b6759e713c5cbb0050fb1308559d1bec6b8f6a65a2315ed8b0bdf5c3e60ff4a0e63137494012809", + "3037b50b12f5c9442e9c7fe9c543f348f5f6eb2de2377a1618cd18d9885c386a", + 1, + "18e97db707a56e5c0a0c399adecbe8124772d84abca9d28bef8303883fb9223aaf92f68cf0bbe2ad73d18ad014971e12d515e87caf346d7aef3a34e7d0602785af3ca8a3d984564f88b84f35fbffd3543f9c9fbf04bfbc84b9f20addb09ff91873f3e30337e191d6d8c5c15431cdf7453cfd06231271c5adf597b8d73f4101d9ff5f5970f1d76bae4b15c9f9b8a7140f3d6716c173e08f6ccfc34c50698639887a1301cbe19c942a60b6ee163fb142bd4400820a4eb8b23c55942be7bfabce0778697e8aafe4d613d03075894a19b039593b4816c995e370e587ffb85959c3569939ab809af8a0fb12ddb9347a81da13c63880e64365d9702704c90cd2921eb30c3c470dc773ac32c0eab89208b9bf7567eb4c797ca128accfa01c5388dd0f03", + return_code::success + }, + { + "6d0daf59e2b7e50e4babe8e5e4690eba3d73423e99dd3ab129d32d7904af3911f605a002ba2f48f91932f2d2e04c6602920210df256b38e52d6503c8a4e5957d52d47b49c82b37513b2bdecb0c1351d3eede4bb50660b48307543d3bb2fd000f243510935fee0164dd30650e56bf3ac128f3ce4b402eef0c29a80b9b0f334a7d9f33b5984d489a1d30ddbe845c424104679e987905f549297cf52b3ca1514c22757d6ae50a50b402ec77b69d6f0863e3e8c98bd0e01ecd23ae0d721f7a230815976541b40cb3366dcc5273e5644c4cfa4f2eea2f1d386e74f06f95bc41f9a48ee21151f5612b7bbe3d15e2e715421911da5b9bbfd8a5c4726d8ff91b1e071eb7438cfa6dd6f96b1d7ba83fdb49fa6b37c51f4580669e8d02647c932f1e2edd19", + "3ddc7cc83f77c2c955f9b62b7a85e80fe0d8766530bfbf26e3c95b47219c1114", + 1, + "2a969fb7f284c4541faf1eb3377df4abcaac8a7f3249ef4551dc15b10cabd1bf2bc2a96dd236d3cecad81190e16ba41002d17be3ac576f5bfd9d707b07db3f6998bcac664bd1e2748ef73a5d006be33880a81ae9739eb7d2559bbcf75d339100c93e170ec7e792fd6172f87ce89626f5bfa4801dfdab4975f0c974cebb78516ca50313c7e7dd8ad817df4e6145bbc6167a4ef11788579968b1dc9e3af2264783abb93e614e4962e9cebe93b0fdf80046592cb907a9a78fb415915aec4223b60dc7c3b9aff719548b347b0cb2d5b723f98211e9110b459224c85f285f93f0faad9356610c8ee70b97d863fed55c036016a44f7f1f43fd0043a93ddc42ec5f4456f61bfe87840395c2ea5525b80aa366cdbe3a8b65d98861d0ffee45085dc8c608", + return_code::success + }, + { + "7bf7545801564b8ee91322690f6495dbe6d97775dc1b016d4ef381c9de8aafe3d9b59144065400978635b3f0ee55df0491478d53799662535ca8df5a3801ca08d0425cf0ebb1b7b0ef8dcdb58786b739724d45eff00a0bd4096a9fdf6df7d200d1c846443d604460df8d965c4e6459e2eb70737c5713400ad43aca2cc29f0948a5fb51d33646ed2e10760d0f33d7400d0821a5527a7f8296645b5879a208bbdfb647b5825e0b5fe50a5ec2cff163bf5357fd7abc79c9b6930d64693716ed2d15a310ef21e1fd5e64cf781ce0ee47ca3762fcf411d9e9dfe47584bcc8462fcad208cfaaf9c82f1bdfee2fa3c99d6b2a0e751e342db7cd57c0e1416f0f1cb3e2d23971d62156d962be56eaf937c0190f65f4fbf345dab0d5fef594e46d73c71413", + "3e6840207347e51e921476e0c5890201169aa46aadfa7408a94063d94826d70b", + 1, + "9c91de3ee8b232de3bd146e8b9b6a16ea3ad7c02e962ce2a50c542dad854b2efdfda991643dbd8ee01c573052c83f50394da59183e16ba56ea1e16023f661542e989f85b901b88cf39fe099d8aecff9fd86542252410ed3377c93b7a6315e113bbc5cbe103b3dba29c5b25b77ca827a15a38c3a7701dadc9e1e3f6558defd3172a97564f807309e7bd275c508974380b886dcb2ed9dc3d5c62a00d2e84855ebe7399d150416e69a8ca953522b8da8592b216fc7e49e614e792cd4016cbf0e103b3b3d8ae164b2d2a58059829bd5914977040dc3d0e4f374568e662033acd9c54c14019f71ae6c7c4cc333d5b6dbb8215ef085b3981b0b5409a1090072e2b50283741d573ba4c08e849b1101890b0190f9b49485eb99c9cf9e109d21a88a1c806", + return_code::success + }, + { + "98ff63938319e13beb5bae7d26f54f7cc5d639eb7ae207ce0d1d3d3f480286c0b83acc6692354a55fdf32e4e737aa8094e2081bf5958e4599da575e28e29cf17ca35cc6271c8ccf93341f39910cdc5c5431ba1fafe780de241223524b0cbe718669ae90f424f963be8509e56dc5197f24e732a80c2e5b761a754e8f8c73e35c0c7fcba00e7add9509d86c5529b735c18d88c76c7d7911800d05a91ab487fbb1578dcb4488c36035df08fa1424b2a8147894bfc86eb4dbd92a059d51f980acb112a7a145d317de527320444e2ca091901824e24202acf199a06d56774fbad1fef47c3516a415e88f374bcb7dafc58090087e09c28fe2228be0221afe6cec3cfec4406db4ec0383517a9d1290590729ed9a557a3fe2bac0093cdb0e6778560b91277ae4e16116167a9411460635e349ba1da161fb122d962b3bdcb773b5dbbecf0cd107f9f12d605dcd0ff834f558cc418b632249f2c3c54320f677cb1d28207a42b83bb13b2a0b30cc41f33f29d5f960190854671b1ee1f25345152155fb8fc13daa09b5911a10b6884e80de8e9ff1976abc79f08cc6b0be2dbf49b651f46a8f344f3b832ce91bbb82c109236fd6bb206566e449138032833c3c40754f19d294f04d9ac2d24948a122209fb07749c2887a10baf417f110d6ce6cca80daae3e7115fee2cc7d70cdabd811ff78e7250216ec739311176c6dfabf3b53caaf66a0528d17d4a382ce1802b7dbf801740ccf813499f5ca7a70ca5ee9a01e874e267032ead1b95046850b1cade80bc06e6ee5144c520b5a2b7d7ecbe400b9b6e77e1360920f0502f3d7dca0558239d634f399f9af8745c6085f8a894233226e385b253ee7f4038f5a42755ea61606d219e11e70321b48827d87d5eac14f433a0638e536ce0eee04a714e3e6b3c2f57d5620d9ac51b6b1663abd099cb3faf9be52eb30b15407aac7ea561b47e6967a96acbdb42690ef693c6d07934fc0b4f17e04f51ecdc8915e762ae4dfc151178f06887ec6518f706001f0d50827bff24f0ac16d2d326301b111108b35f1b98b2688f6c327a65ed0ea337851d066754d531d51fca7412f0982e4c4ef21773179f24997a42f8a4d6f339afabd999256debd612450539d0cceacfe8609bb6be7ce7c594ddc4190adf70dc877087185bfaecd62a5b53d68e4b5e3d2a143cfefbdb4bb639e856712f0f5eecfd8ffdd6ce08684edeedd6e00e59e779485f80a188efea52a8a0c9d7d63cdf32f9366629a059a997323ec561ce0e43011e498977b1359763e4db72f5078946d2a7757a1add988d9d81bfdda48a30cdd24be7fb010e91a82ef42b266849b513c62445cc0b58e54cd20b389889001291f455538775c3fda0f9b0ec9c875f9a9906c4cb4bfa68ed1300fe62682c1a217912258ab3026f4fad3822775751083e36f8b41c6fec90b23b0a53b01509d14298c11a4f2da42dc3002a5429086cac69346e98015f0641a55f87ee8e62241936c38d125cfed2f240d25d3ce72efe1aa913020d1de74555b0cfbc494d6de29eb09af18c2c89e77ab461a2c9f7015111283bb4adfa1c08c3dd0f3850089128c04859f140d31d1ed22edabb7235604ed8056a5600f7f1c09a1a8eb296f6777801", + "48a9410a2a1ece4c2060089d43d5823e050e7b37cfe62f1c1f02eaba0c4f65150245659e35fda0a14c2a9e8b28d08553dd25445522924f1f6d91136c630a08581980e744c18ff77fc5d5bcdf2d88da37da96c874a3154a023b2435ba7c40b6552900c95db9c62446cfde76bfaddce339852684ccb18f6c0ac737020c339c0346", + 4, + "b8e6b7bad865d19f191d25373c675d3f03cd4041c5b84b1832ec9cc9ed1297511025a1292f84d8afc2b9296647a3ca16502ff327965c37ae9d233f90f288d670e8f4b66d7ca8496fd7e09a0daceb0d93cea5a178b33507d9d2cfeab4580a1b145beb7ce5a0990e99759eedd14e601cb0ddaf478dffc98a87ce4705b98d91ce3f1d7f6322dbcab5e27057bc28c1a0f60451408b08d878bca1f2afead2921e1f9307d9c7c50ce92bf9727c0f375e280c767097dd0857151a8aab622b3dcaf197156e43a53e8fa03eab5bc213d217045515f62dcd5c68ae8c180afac5eabbd20e4f8052db79b6cb97276060dd16af90580d36a142b7bed1a8a5e8aa06221251ac9753d223c56927310566650fc55607610e170437af34c2e3ff493fe55a69c5dc10", + return_code::success + }, + { + "75387ce4cf7b8472949c128e1418d38f4932677db207ccd28d1c6a498bc24ff91f49d69c991c6ae3d15c26f761b51b0fc46bcaf260173a59ba6e7eb49ba671a3d3dd587313b43bbdb6be6ab2d469d77c6836d227f1116261191eaae3c93b3408e7b3026880a98b719ff2f45a334384178850aa666db9ef17a75f4ce6144cee080bdc0f5defcf6549ddd3bbe275a00e11dee805451b1d431b59bbc78eb38aa00e8f9bca043ab92c24f05a252949e33d4ad10d90d38063c4a73a2551a1068bf613ade87482b842f06d93011563cd8b5fb860883ccc23c78845b28d641a9adcb30940ef5ee1d022f1414946719ee913250378849f9e4bb00304773bbd1109f79d37bab2a66d36c7d48f197d2ea9b263f425e8bfbb360b327793362ed75e353f7d04376b535cb824137ca6d40ba849d5e92566173d520f5a8cfd838266c90d80625dc1b78df6fed60c51a524cba5d74b6a00628adbe7e90d92e601946c166463f24e8d5508154265f5b1be25ca100e6db502a65681c1cdf6d9a922b1c373f3e2fb1967a4d5753b1a0a6ccd6430df5ebf2a1dd663921f0ada568d3fba68e339925f9f520649557cc600cda6bdbb30fba7c116705ee98858b3d0fc8e82a70587b21579de3dd175e8d252ef3a8ffa1f9b559a57a012c880102a4289250438151e7f630563910fc6d5b053a0d843149afad7b637dd851f141422aff972a9ec383111733153fe5d8fadc6f6d37ee872595c4bdf144067ab39dd736862cebcaba1d599c02af7ca091df1eddd30f901c8ad353c04db07c3fc2c31e9279f2bddb38dff85ac0c59bfd234428019fdf7c935a8db5d4cbd4f8c99abc077e805efd729b67bcc05bbf419d5f1cd36268495d79c258a8c0207f10b30a54f3a291499e22ad20c8fc6d0583b66dadaab1c14f2770a92b134b8b257373a4cb3f760bed88aa50174493b1817aa16bbf5c5e9994782d3ad7f1cbca4c4e870398b207a66ded6350dbbad80812aef94e94391740f72bd9910209ed200542bcd5d6b5252008f7d91aca39c05863b0605d704da2d19427275916c763d95837dbe7a8feea999ffd760fcceebaa16c37789b67a9e0754e0aac7a842fe5421a6fb204315f2ea61ef6da436dd16fe2b83f5ea035a40c0dbed588e300b8d4a08176394da6e7dba73097123c2b48017a462ffae48835908d56314faf0993a9b69af072075217d261924b9085a2d9ee7105e36079a7813d1862eddfa7727d14e6ce949f83023d84070e0f19e980220d9d5a46f5f0a3d7b533abf60e9deba859c19762ab2ac5bb648b43c2dbdfd87c91333c6a2a91488ab7efd117849b7552ea442a5f47e099458ad74ae02ab028ebe44155fad5693b5e04f8e36b82e4bff5cfa2008077f58b3185e3b775f39befd9248d9d031f29956ccbf3b8a261b3879b41211235521d1efa233235c6a86fe65b40ec7cfd2ba7bbf751c8d55949a8968182dfb984dcf57264e0b393c40b538d4c3940e117a9023e392a6478a0a1636ac56c58b6c09e0ecf5a50cc74c427dda487f14de8baa5f3fadb086f7d14eb73e5abdfd15a4442435f81ee76e34e70c73f9ddb37d70b09f6599863c8e3284b95ad61fbeaad221fa8c479f261b5f10c86865663612", + "b4ae65e9e683c913ab592d1635b2f225ab9b53b10ab2c00e354846cf0c3a8910f25a4505a266f1680e8e2f3829623b220ec00c659f85d123071c3358b5fd8264307d2e145ce8949c226980eb5ff4940501307bb1f945501eec5c561c2b111c01a3aa407a8df0ac14c9930109aee2d8257dc9b603f67ffa23aedb695a85097d1a", + 4, + "8ed42492918a86e5fef0063d0159af9fbeb85fb55f6515154ffd0c0374de5e1b21fcdd8fb32c297917b4ccf124bb750f11f2b91a0c47516854ad0dad3d7ce801ded19deb6a7222b58c43b1f569b54a5d903a7c270bc1c3a90f604d7c27cb51008095fe6633c8bfd7f0714cf20014de9c854bdc17d0eee63504249e3e04d2a8fbac9a3c4f65c4f6b438be5aeb937b2f126c4783dcf550868c59b627954c505395c1e316dd237e082f5e2e712db2fd55214578f2c993cb3fb434c752b81d6236169b3f2f30731c9fad762cdf1598b525cbae27fc4b76758b20eb8af6e734a258d590e9b735d6163c02d2c7ee6313446413319a8dc51d8d5132f22153b693561389ee90b9e5740a244295d254fec13e5cdd7bd55998898316797c68fff1bf33d512", + return_code::success + }, + { + "3998df17210f3e814d6bb0e743184f82321f243b9cba7d965dd9ceabc1cdacf54726b994369161906ab8ba10ed94c002fa242b82c4fe9bfc774bc0cedc3be2cc8668a1f5b07f32215b711da58fb14813e94cb97b5f9c1be11b505da863d0fb1894a7247d770687ce86fbfef583763eabc6e12e82073762142631ed576312b0beb07e933adb342c0f9882b20435d05019e13b074112d96c8827504ddba5654591d8001cc233e4648c40b966eab36d3a89d4470e94f0ba505859f447f80c5bf01442430442194b26334273727234d519075dc6a7f2a2782d5e0073ed7171dfef62999deee900bc557378893baad5714712b71668f3957d1bb87736015b4c0ed6ef24ee3647771e6ad913ff55590658427eff01272bb87ab4caa82ce8e5ac967911f19911aea7fb3da3711144c2d18325bcf899c3ba3ff1ebd4d2f6d45082a86233382bbd38b6fd0cbcff6c74d14b4c6a06376bc527211403b4285f1f4dfed47ad8a0494dd93db82d5afc02cf422df7134516d2b00c7c878091184cc20ccbdeeb0b70cc22d4100bfaf1ea8bcb13076da4dda9a60f60f88e7ab1c92956f378a753a13b3489b5a2015f14f41605e970d4da068527342540d6f57bd8892d6fbe8bbafd32e333b6c257ba6fa4073b715b0327b559fa562fcb16a886b3cd8a6d27d96806e3e7efd32ee03e03dc9cd6104175629523e8cc5730a03b5fe2c9176af4b0d73cdd654b81cb14bb44d54b9f0f3b184315978748e0c6a2731bf6d3bedf5088108cdae944ce40fa8b5b09b1458e11ba8fa79007dc043d55a7e99d037fc00eb408195855d8dc4e8376c60f66f55c1a16b11abfd96369d3cde62333aa0cd14d9968ffeb0783a656866d7054d2477150514f0e0435c7a4d0301fe604d03672d41fee5e04f449e949f91409329a3ecdeaaaa27e3ea28d288951dd512a93a94d3d6c910f8a93546f5de500a8690fe70dd59fb69e5d8b29d8cc1b95c47cef278fde33b26f32a6188dba7ed4dafd37cbbe2baea40d955e5f914bbdb31ab81f1dec6bce1ca2247929e3e80b80f086072bd271d21b594e3b789fb5dc873936e78ffa6f449b0e5db21376114aa3cc2da4caaa114b4d1b4cebc09bc1012ca388daf407ded70a05111d502e921f74ab24c9c26f249104046350db0e7ad39fdf033bd0383ae641873f8abfa2e3724e45751cfde59919f63e18feb420f4db75bbe067b8db1ee7a50a147821e50d30ca4f1e9ff54b9ae2df3234d08be1f648c1995c858dacb66e9b476e7175b007c15cbf2b129508e5cf8e029673761fb43796a9af6ebf9a75a950c9bad74d16243b95d7dcc9cbe2670ca6b2f0068d7368c35ded963187955276e1157868b3e02489481540ab9b46ac14b258d96936ee2fac67a655681bc261bf3b5d48e0a483ffd3e9f2231ac516fc8a1c06c5cb68efa822688afb03f823a512a0197b4092009199e8655eca47b0d5fa4af82d03dcaa45259eb3c2a3bc4f37c3f7198679b9ec48fa3dd145359ff0532993aba1ddf7f8d3cca01fcf758b650276d686d3aa04df8f39d4c221822093b15bc70d895a558ac4dab0f558763caecc4e3c15c4dc416988c52ab3320e471d64b446c58d738a31d60942b57ad9cb800ba4330e", + "cb18d3525c80ec237373be45fee17c2b24c5281f88613721f6285742cff4fa35101fcd043f78c6dd72e754515bccbb1dcc793c6a0dccd71f1e9f1a5e27b534389470eb12e82bd5310c9baa2a8cd9c148f97e641e2f22390453783b158a4606580776c370be1871c4e209b9e84e316e3c459e05f7028690185e76d1bc41f2116d", + 4, + "13376624734809dd6912bcac5fca9170f7ef6baad99a3b08778cad1687281be060d8f74ef18dc949f90b0a82f71d0319b8af17e762d4477670c6af589382bdb3dee071cab2142a4eb3106a6b58b5e8023005d660a509fa864a3fb2e3a918321391b30e4a928a8742b7747f74680e6536fef8422ecb3fb1a5e7cc3f122bb60df2d4b93d7590442639794070bc01ded2066c71913c94dbe504e3b75b095d7c6097b3770e6ebc9e013e0cc81c4f5fae10db1364b419de2a7be093a8c5b02c88b018e6b99ff21ccea083789ab3e0454d5c36d475a4704db70ee4a53ddf7ea04844219980c2edf17fa408ea53dbd804b76515ff7fe39d3d03d77abbd260f32aaeac89b86c9aa5a1f4f63e25e95d4b9bdbe00338a3a52cebd6541ca7c5486d630cd202", + return_code::success + }, }; for(const auto& test : tests) { @@ -340,7 +374,7 @@ BOOST_AUTO_TEST_CASE( bls_testg2exp ) { try { auto expected_result = hex2bin(std::get<3>(test)); auto expected_error = std::get<4>(test); - c.push_action( tester1_account, "testg2exp"_n, tester1_account, mutable_variant_object() + c.push_action( tester1_account, "testg2wsum"_n, tester1_account, mutable_variant_object() ("points", points) ("scalars", scalars) ("num", num) @@ -371,14 +405,36 @@ BOOST_AUTO_TEST_CASE( bls_testpairing ) { try { using test_add = std::tuple; const std::vector tests = { - //test (three valid g1 and g2 points, on curve) - { - "160c53fd9087b35cf5ff769967fc1778c1a13b14c7954f1547e7d0f3cd6aaef040f4db21cc6eceed75fb0b9e417701127122e70cd593acba8efd18791a63228cce250757135f59dd945140502958ac51c05900ad3f8c1c0e6aa20850fc3ebc0bfdff02000000097602000cc40b00f4ebba58c7535798485f455752705358ce776dec56a2971a075c93e480fac35ef615160c53fd9087b35cf5ff769967fc1778c1a13b14c7954f1547e7d0f3cd6aaef040f4db21cc6eceed75fb0b9e417701127122e70cd593acba8efd18791a63228cce250757135f59dd945140502958ac51c05900ad3f8c1c0e6aa20850fc3ebc0bfdff02000000097602000cc40b00f4ebba58c7535798485f455752705358ce776dec56a2971a075c93e480fac35ef615160c53fd9087b35cf5ff769967fc1778c1a13b14c7954f1547e7d0f3cd6aaef040f4db21cc6eceed75fb0b9e417701127122e70cd593acba8efd18791a63228cce250757135f59dd945140502958ac51c05900ad3f8c1c0e6aa20850fc3ebc0bfdff02000000097602000cc40b00f4ebba58c7535798485f455752705358ce776dec56a2971a075c93e480fac35ef615", - "100a9402a28ff2f51a96b48726fbf5b380e52a3eb593a8a1e9ae3c1a9d9994986b36631863b7676fd7bc50439291810506f6239e75c0a9a5c360cdbc9dc5a0aa067886e2187eb13b67b34185ccb61a1b478515f20eedb6c2f3ed6073092a92114a4c4960f80a734c5a9c365e1ffa7c595a630aaa6c85e6e75f490d6ee9b5efbba225eff075a9d307e5da807e8efd83005db064df92fcc0addc61142b0a27aa18a0ebe43b6aacad863aa33dc94e5c4979edca3ca4505817e7f21bde63a1c22b0bfdff02000000097602000cc40b00f4ebba58c7535798485f455752705358ce776dec56a2971a075c93e480fac35ef615000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100a9402a28ff2f51a96b48726fbf5b380e52a3eb593a8a1e9ae3c1a9d9994986b36631863b7676fd7bc50439291810506f6239e75c0a9a5c360cdbc9dc5a0aa067886e2187eb13b67b34185ccb61a1b478515f20eedb6c2f3ed6073092a92114a4c4960f80a734c5a9c365e1ffa7c595a630aaa6c85e6e75f490d6ee9b5efbba225eff075a9d307e5da807e8efd83005db064df92fcc0addc61142b0a27aa18a0ebe43b6aacad863aa33dc94e5c4979edca3ca4505817e7f21bde63a1c22b0bfdff02000000097602000cc40b00f4ebba58c7535798485f455752705358ce776dec56a2971a075c93e480fac35ef615000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100a9402a28ff2f51a96b48726fbf5b380e52a3eb593a8a1e9ae3c1a9d9994986b36631863b7676fd7bc50439291810506f6239e75c0a9a5c360cdbc9dc5a0aa067886e2187eb13b67b34185ccb61a1b478515f20eedb6c2f3ed6073092a92114a4c4960f80a734c5a9c365e1ffa7c595a630aaa6c85e6e75f490d6ee9b5efbba225eff075a9d307e5da807e8efd83005db064df92fcc0addc61142b0a27aa18a0ebe43b6aacad863aa33dc94e5c4979edca3ca4505817e7f21bde63a1c22b0bfdff02000000097602000cc40b00f4ebba58c7535798485f455752705358ce776dec56a2971a075c93e480fac35ef615000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - 3, - "af587ca8f5f0760b888e4ec66748623d1b13986547b5de2042ce89233c2c837bbb080329a505285c948d8bb4c88a5914ae216a64db582ba084178db4364a7b3843ef7fb9056a90526d27dc9e252b38600fc54ce7a5ec15771c555816edc26d0166e75d3315789c846387c8c234b1c98b50baf233b7312aa317ae56a2bfa170b1bc43f0e046b4a1f45cb7aacea7d0ae0320496e3960d4dbc2039027ba8cfe1ca120ea98fa94cf25034ccb5e74033f447b837a78b03affd44b87f865f3d713000de78ab5629dbde8d0c8b7a28941717be3ebd23924cf16897144bb69730f68bff5a109fc2e6d563b15e2eb883cf4becd11edcbc2ec4402c93249389ed612fa0396ed6eadcbe4d703667d46b0150ee3a5158caef956791e4f527e1312c8402f8509acf7001dc0dc311549d76398c247e79b737b614d0a6663f7dbdb314e5b51eace14457ee7b1f3f54d5987c16c8f89d1022d91d4649f5f6a204047077e5791a654cd2277506cd0af77f9ea789278b364c115ec07ba14390a9c22d59aa9c97a9c09ce025b5e14443f3c4e4cd602ef34105fadd82837fc5ce60a461e6ea11b13ae67b82e3366a2b2d1bbe78b2579173b3c0c5aed88b2949403060c3e065782bcb742c55c559e75e373293d80dec54120773d80144b21b353ead58dc8427e5b9cbd0c1431f1a74caf5f57c4b55b89810029cdd24ef4a029797ced68ff882492a8f55f31fe52217356366983e35d2a5640e818cc8bddf9274de0100e624a6bf03e2b9ff22f8dda09a46b50b1b305cb6adfa2ae775febbce4a2b507cd2390db968ceb13", + // g1::one, g2::one + { + "bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f117e1e7c5462923aa0ce48a88a244c73cd0edb3042ccb18db00f60ad0d595e0f5fce48a1d74ed309ea0f1a0aae381f4b308010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "b8bd21c1c85680d4efbb05a82603ac0b77d1e37a640b51b4023b40fad47ae4c65110c52d27050826910a8ff0b2a24a027e2b045d057dace5575d941312f14c3349507fdcbb61dab51ab62099d0d06b59654f2788a0d3ac7d609f7152602be0130128b808865493e189a2ac3bccc93a922cd16051699a426da7d3bd8caa9bfdad1a352edac6cdc98c116e7d7227d5e50cbe795ff05f07a9aaa11dec5c270d373fab992e57ab927426af63a7857e283ecb998bc22bb0d2ac32cc34a72ea0c40606010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + 1, + "b68917caaa0543a808c53908f694d1b6e7b38de90ce9d83d505ca1ef1b442d2727d7d06831d8b2a7920afc71d8eb50120f17a0ea982a88591d9f43503e94a8f1abaf2e4589f65aafb7923c484540a868883432a5c60e75860b11e5465b1c9a08873ec29e844c1c888cb396933057ffdd541b03a5220eda16b2b3a6728ea678034ce39c6839f20397202d7c5c44bb68134f93193cec215031b17399577a1de5ff1f5b0666bdd8907c61a7651e4e79e0372951505a07fa73c25788db6eb8023519a5aa97b51f1cad1d43d8aabbff4dc319c79a58cafc035218747c2f75daf8f2fb7c00c44da85b129113173d4722f5b201b6b4454062e9ea8ba78c5ca3cadaf7238b47bace5ce561804ae16b8f4b63da4645b8457a93793cbd64a7254f150781019de87ee42682940f3e70a88683d512bb2c3fb7b2434da5dedbb2d0b3fb8487c84da0d5c315bdd69c46fb05d23763f2191aabd5d5c2e12a10b8f002ff681bfd1b2ee0bf619d80d2a795eb22f2aa7b85d5ffb671a70c94809f0dafc5b73ea2fb0657bae23373b4931bc9fa321e8848ef78894e987bff150d7d671aee30b3931ac8c50e0b3b0868effc38bf48cd24b4b811a2995ac2a09122bed9fd9fa0c510a87b10290836ad06c8203397b56a78e9a0c61c77e56ccb4f1bc3d3fcaea7550f3503efe30f2d24f00891cb45620605fcfaa4292687b3a7db7c1c0554a93579e889a121fd8f72649b2402996a084d2381c5043166673b3849e4fd1e7ee4af24aa8ed443f56dfd6b68ffde4435a92cd7a4ac3bc77e1ad0cb728606cf08bf6386e5410f", return_code::success - }, + }, + + { + "0ee342698bb6d96f5862e208f46e02b2f1afe99e975c6cae2f843ef50091e72e6171836ebe8e093c79c718ddda8a3915f2a17975b7174deef1a0cd449a544598028fb9966c4e07d55efca7cbc123ab1b0eac14f5c5143abdadac359f5e0a83150100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001dddf8e5208b9dea3576cea6a4ebafc886e7d49e6ffc7229e9e624c3e5a76907aab2c4eabc486489c90108f5b6cd7e161a54da1d12074d5032690f3b1124bd1b3a4f0772ec2027a901528b77906a3ade7095ff8fffcec018039b0b130cacbc1301000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000097f1e7dd8bc500dab7bee0fa9d6ece17468c80e6cefe99c750c97b3f9fb2d5c705a9a76f6cd3d0dfb98455eb2901b0037819d28e7396ca05f6762cc4199314cafba4d88497f5b1b8d6b2c9757ba7cacf0be30b165c1b267cfd89d5366ae64500010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a806f813beb0f13c06fec0b8fb70eacec12d3c94d5a171f74d90c616d788ad56bc083b1d1ede17eb7adb88c7241c85194d264dcd282abd80390fd9e08270fb9ec01ca19f08fcb167d6c8db813517d85f41d3bf844339ae7c9142f33ae21e5718010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "7ee127783617cb4ef58361b4b760b9405bd596a9faadef2977e39acdc4479f4f48b333b7ee8fc5f046e2a1838534d50335caf5935bde4f3912848f869ddaf64a2a5bc96e35b0408de053bb61f9f6af33a1cda5fae130cab5f018d14caa534d172242fd5b249d752ab58d4dc6a75cbb3a70474a5a97bdb5e46e3d318e59528242ad832bb1dab5537134a77e1609d3fb07bb2e511f92b4d7a6ba393003a1b0605a743b9d9fbf51401d184a0dee8483fdb84d4e022ec838924bea2d87bd8b64f816010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000318a2aa7183338d070381cd936c5ed51560b6955eb710c235ef8dd2024e46ee18add02958f5e81cf9b63c76a9579250f73117ab5396fae7951934389c3fa2898aefee684eb091f24e08175b0c7d3f706d10a70d89ac355b41c73fa1fd8b825041788c011a785b7897e7b204863a33aa83bad42f84058de5f86ffe9164365d010af5d6942d04f204db93d3676ea530c1055a614277996f55cfb7ffebf6f1f4e77803c96ad61ddbe8797b15dec6065fc83b206549cb860a90174086465912fd9080100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005caced6097678c80eebf30819f32811653f02b0fffb38c595f3f21698fd7a9149e23ed9443fcd440d1105f74b32549069b424a7d2b39921e1aaeb52c964b88f9e3a62e9af8c2d0250ce5d05aeadd950399d6d76a416fe0ce54939ed7800d47065d65053eec226c31edcaafd8b343f1a7cf91a5ce818331f7ca37fbcfc13cf1d60bfd9294472af7a4cb7b796d1c1b390e7b50fd1bd3e3ba2cbd34eea6f64baab7e847698faf692aa29af20998edeb7633415c65f0e95f5acba7bd5bf4b93cc511010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000da9dd92b16538db8ca15156932138efb27793bf5950bb3b595efa580d2a05e00e932637ad80a88b1a91a7aaff72e6f19c30fcbc7b19e9b6746e18c649f576b80b1365c835f826a76bc55741388a96d98c84be96fe5d958c2a6071c14908f3d0cd68e45e0fb13f4307f665ce5cf5895912dc4cdd59b5653d01de11a23363bbc8b09ce6e3f19ad82afe0a089858f446b1305af6ac0c4e5faf6d7936df6383a82e4a8f647dfa1f40d00745d05bf5e9af76d7341bfcbd21baf6ff7c981a72d08d518010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + 4, + "6a0a014eafa202e4302849b3fe5f80c8ee22c746ab61627cd7576fcd5b762cd7280042d0ea26d088a0c80622cda76410cb2059a83b7b4fb283727773931b1e209cfea44595b38491559e4f1f8d9839890c1da6e8b7b6cc4952e1458c0e50d313d01175b8cbcff7191cba5938864c804f1fd7f2ad8cb7ab99ae62b05bd8fd0cfb1eebc2a2eb69376529f5358870e73a0bc812dd065c74f5d95330ea20878406379a4b97203db11cdce74532bf8c4b7c2632d3a055371586ee886d22c280bafc17533735f06f551f7e318512a34da546ad00ade5b7567faf2fd5959c8a8048e599eba661ac3bf143cfa2e7c36baa5cf1017c531db1ead9e96e091bf6511b9de5d3c526f120cd6513fc2570a1c77018173a8d36ab92b735abe1160c010a827c1312d63492594733637d982068d93051a646087561d65832369481a10bf63791bb55d8411b3dc20579a73c9240262b3925073a769a55a74fd78e5900edee879cdf0d1b60652321454f87dc981b4b8d49e50d23e4b64eb4ceb47521a617154af1ec03d753fc92c5a42daa64f8933abecbaa71188a9ed03adfe37c6f178229688f0e546fec5c3bc283da3f83fa9ba448a194080efebdc4710154334367493fd9015be51ac6fec460add6ce0e80aec5c65f43379aa95e5bb867fd231e83a700490215104791fabd039a3b209c482fad27ddebdbf616bc16a3454d38ce192edc236de08bb266a74df608c4013a15e6ad1542fd1758589ac22983e14bc9396cdbe737da8acc486b96eb093021d2af944aca1299d7842a90c49eb32ec4f4b1bf3de3b80a15", + return_code::success + }, + { + "24dc1e4565f20fef3f2cbc0d4bbf52857dcfe43a01d762c3f17069d145ca558885b28c4c09d02f932b1837e8e67c8a0e541ce60417524f1f21aef285c9f5a24b37b52cf0d436ed310d23d45900f53ae297610365e2880424e6c1fe616b83651501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000056dd282484e3a3ee378a862640887806a7ec6c8bb7b761d96dcee583879c94eee4d9fc522931d13531da3be4f9fd421469a0d52add6a2469619f375fb253478a9f8bde27ed5596a3301a00b297607698c3d01ec22c60aae66cf274a3de1a480e01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082b4ddba8598df3c1cd5882beda98ed0565189b772442aafad93ff44e482a2ee8eb2ce469fc861d5eaceeba136e5af068fa30be80dc5ae11d0b91eab46c31ce51a76716d3b5ed52904e93b9e0773120188e02bf2f254e7411fc22b2967bf9405010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d856767795acd88b4d2036af32411a46f86e3164c1d3d7c5957de95ee65cec2c630e5e2c61a0fe85bf754c28c50d4f16102b8a7e881d646f4305862b2a545104eab522a2436e3bf0d27c9f6b63b8f92224ea1226a6dd1bce94a2514edb2df018010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "f52e9ed1085833f6833969804dff5becc53bc2ea6ed36e79fcc66aa1cf8305c2ea7eda94e5763477187f858e73ab43192aa512004c7d391c0fdb759f4312ee2e0c9b5e2e8822953b9da5c249750ed4879ae401126fa97e96ddbec247e7ae2402d6db4d7f8c09fdae0e725223ac225e1dd67abf82251221b341152f354ded1289eab076f4e6913035c46d17aa47a2ac0772ca37ae31f56cfc9072598da0b3c09a61122398a1a19566a6e530e8b22e1c17972a3bf5ebe3c21d973404452cd7cf100100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002cc290b2c5ea9270cb4cde570ad78bf9511425bf1a52722f1f334f8432e6fd5b4625dfce407d6acf5d399a26eb0c52144b94b35b81545b6318fafd796adc69650e1488087b2376c911c7db160fdfabe4a7828807baff5d99b63fc772f1542d0391916e77d1bff44a4a4bc3b0428a57c71730dea6ae556e1f16a450c9188b0e9d21713990b9a4a3eae42549a90c7a421538deaaf4c5c5f08394f969adfcd3dcf19df8095c91288694d68ec54089861308aa476ff186de9b4ff9f663d030824502010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ac0a7da30ea2219fda60a92fad492f043f3bad3672047826a49f2a155d39fb4060e0dad7b09a27f4e13a9c0fab351e02d8ed9bb6a7ca158a93a2d8f92c161eef2d044bc97f632ef611cc410e32c4211b666312f3a149d322214b226715324b11537fc75a01c59e103d5c04cbf9edc25713a659742d8b8ea2b2313c277cd7c855bdfff230bbece263ffcce222a20a370ee2cfea8b543f94f758f98d3c0874d497def5cf4602fccc8edcda8c164b49379d8ab67b622902e253f35eb81c2d641503010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bff971704983937d030eb335273dc92413925720b38782fa91158d8dc620a4e96545d3f3a061a11d6d7d7ae7da860c0bd6194f5958961d8362c7dfa0a2786bfb08c3f55a418834508d0d9af6dd0cd480802c2814a31f0df6861de3f2def3f50e9c71b9534fd269bb6e4e8c4e27f7fecffb7bf8a0f21e4d4a3fea63e62f45893f0b45220f9c1a0a0a9249f9aca00266018090884674705d336768b7e203c6972d1a967dbd1c746fe59c3d1a26ff9dab3b4b0e20fddbc1ad7da7410629b6f0b90a010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + 4, + "cf7baf3beb19b125ce001f992f6a669e3e6f3c1426ac2d670cdb57a1c403cf5b65bd6a939cdee21cce293d94505ea30b7828f77a90f659915676dad107d1deca01cf756174883a7c52c14726ce8730b6b46ac6877864c55d15c092f7653f0102cfe127bb55f78ac87b0ba94c074a406a08b0bcc897ca5f00cbdc971b53ce704a924268cd4b8ee5d83ee2d9a2205dd901f3eff15bd7e1423da14e403cf950250d4c25dc2d3afd3595531cfc3057dda7f90cd6314f07814ae1f13e8e8ad4eae208e0c21ac198841d5401b88c08330fca019d81ba04139c47ebdfe2c945fe791a74a8a298dd5cb9b5dbb4f83680d78f9e070caad15878a1e472cd912c262f1aa78b5bb6f912602c0cb04b20450a74e1d4bf555b49e901b7acc86b6b87406393f903b8bc3c520a28783cfe9c79b496a7ae25af34e74672cd350bfdb5b5a9f46cb512bc0aa5f8c7dc125cccfa291069b44f15bad29e3e2efa2ff1792633f05f345f1b9066a3f9f67d90001140cc320ae80588ecb0b3eb60c6fb3dc9b434d0bfbed102afb2ee44b999c596699e19df082b6aa5aff6e1d63428a6f48c6a8217a970cae2d8438505b94243215649cf42ebc0d507079603121a5e817d026435752be29e7826e2116bbe046d6d620e9b5ca859761ecde89a1c7f01626fa0e4041e7c6a7e040e843021611332949d27d9cec02ff2b250ddee34cf583e98c45a246d289ab19a55023078a25dec107f055adaebf917046c3945631217d27b5feb6effc011e5093835c235766ac77f9e17b28cd628e062493024247dde36ed30fc71f97d0ead0d", + return_code::success + }, + { + "0d4b4e3c9ac607be0765f747a2120ef024302483a8b8e85923bf02ee61e1add2c1e9bafe998b4bc96a94679bc59be100e965ef2569abdd63ae9e1048ee3fcc18cdedc82fe29b963765490885a1dff567468c17d3ec0d764c5f3c5e8aeff9c501010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab8382a94b79513a12e2c32355092e2459d5dd4ed1add96999eac8b01807f71869dfa0241162df48a5e27b817063db09a85d39713d77ca8b3e2e31e5bde3d01b4e60d0a1fe6f3c8a34ddc352f020367122417b8b5d51adaded5fac0a8c811410010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e876d70b27c073ef9b5e96dab271381a8389c76fc952597b0487cc9770ef24bfeaf9c24c56063cde22401c25460531130e8844a053fe29fa5193d7e29d28c1a36f0c28cb30f9c4b66ab1a897cf9dbe1ee95ec38ac703878e7290aaf7777c1a0e010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c972a0f98fbfe7a8388a9c540d9c4e995bb01f544655e544b352cca1be6ec12d72fed8d48282ea5097db260a54b1a30daf1a03f8505c4bd0b5d146525570f6936f6cb79085fcbc691fda7482f7fc5eb2d66c6621344fa164647575f4de665818010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "e4754d08ccee74a9caa97207df25d9ab389cf419edca9f09824d96a41eff4bddbfca8501a9b88f349f732c4689255f0d8c080aed63f33ca3e584abfffb9da0cb066f2fdbb55b1a74486ca8ac1d2743e0e5e4a1e2d3e7fc2f06b8519b2903711143bc4f83c4d492b69d9717667eb90d195550608509068f2df97a2100a380642d20166c5ea2eaf9cd2a3137ccd9beda13d3eaa6fc235ff83bc54d1b28ae2822e0f07d600bf7d670558cf42459377dd91593f5d2bf6c0ab9f0b445749cf3822c15010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000db6d4bb841ca516a01e631aa9d583d1b086cabe53c5ba89b07818d74a2bbebc613dc711a12e7469274291ba8d74eff1699b07b6022d428c10b0d99a2b4cc68b73b8998e21319e7db981d35b9ea5cb5339d6c324c659f02501f5fc1d373750f0d7e5c6bae1659a142fefb2ab51cff11b56cc055ad49288f0f224d64d45f03ec98c514fc58fcdd124c420c5dd6d170bf1927ea611da29ce1b634fc1e5923c3b187d8b102cef09d9f3b6dc178778bdc1a73e0aab16f87717608ca46f3c44f48830a0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007a467036d6400b4f875e8c2a2635bbd3e49edbe95007184238205550acfffe1745e38dce7df8f10d790cdb6d0877cf071ead2b5581c7f58bff436ee1dbcf34fc482f8a45b9b2e3198c8e8d67930d889a24b8a2c6bee1d1d81a2a9b3dfc10e50f2ac51f1178908d5a8520f0cc36df2bbba4a74d6868980d160b35da0ebe7d4dca4c75655fb77ae3dd37680405af9f460c490d591876bc42dfe6d431bdba52f5a5376cc85c1f1bdf10cc30c78fdee777cf802a1a364810d91a40f18ee74df1260e0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c70ff37f672c48417e54ec20922b56de3a0911129f1a834d940cb8dca8829141dcd4c7dcd054f193a181c01b24ddc0af3474d1163b2478de2c7fb3824161d0ea29fd57a2b8bde34aa2417ac84176824a0490208585b9c5a678da865f17b56106576d239c5ec25b93114ddf0a91241093cd3ab8cea9f700517f657a18c3d505f17a15a2713551e8c578122c6dab61d19436094f7618e6976ea886b49710db5f40abcd0b4b4ca386e1e74b5900946ea0d62ef1912213b224c457eed8ce74ec80f010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + 4, + "286c55106bf4aadd45598d0d637e267bc5e94e8f550eb3e9b0d887f339dfe858925f0e804e781f2e0c04e897925f6d018bd6e5739eb2ad1a44f66eb306cf32b73a077f995da743a0c7a4dfca53f5dd9c70ef8a36a811ef1839690ea85a562d013d7ea5b85705fa3bc27fbc72b947d848b2ad9449cdd47413c97eecbcc657e79b0c883cd68734060273b1ecf2c747140c4d8d1aea519825589bf14af8c91af46f5219489dac184de82d87a466fe2d24d003916e4b0b6cd97a3b4c9aa4d93fa118c834ee64eda0d65578fb28afad20d6f0ba21d93ff2c027f1e8895646fec77e2bc63084a032f4a5cdf8c7b9d0e5abd80f850543f787be24559f93dede27f2a95e48f378c73a4d22d38e013a6fec2858e100f1b7290f17d82d88e21690a2454716454db66268274763175c8c38b1f864024a7e9e0c3c5564b16a7c90125844502acc28eecfddaa148a9502c2f10f506213fa07113ecf0e25e311625a97b4c3ed045d957d7f7a6dd886eb86f6b8bb73a6eec2790d4256b77405aac4056744215d06e4bc1e963f777865900a62c9f1794ed060dbf12c7caf6d377c6e6aacffb3cec18cdf0b3a3686f6be7193bb84da0e9306fce8497146c2520e9c3a1b0e0118558d096d07d967d6cfd1c1247e90fd734c8ee3b678003b9764b776df0717706fcf011866637e31a84866e091c16ab04f9be3d1c33e0c19e513de3054e0b69566c559c988a748f930a9067b8be8e5cf6ebf09fb20a210c411dcd69772e9c314bbcb2dc84f51a58043408f69a4082185c32f42486d72b00c672b96276e2fe7044e7307", + return_code::success + }, //test (three invalid g1 and g2 points, should fail) { @@ -428,19 +484,39 @@ BOOST_AUTO_TEST_CASE( bls_testg1map ) { try { using test_add = std::tuple; const std::vector tests = { - //test (valid field element) - { - "c93f817b159bdf8404dc378514f845192bbae4faac7f4a568924f2d9725125000489408fd796461c288900add00d4618", - "d8e09005badb694b1e5dba8476ba3012cd2bf0c472ee1811ac9b34c869638b47e669bce16933e98ce9b129f83d93d71890d6fd13b77d4ad8df1a5f1c6b81df2b3f305721b7b7874cd81eba23ca05e8bc974b14f7e4c2c77cbdf321c340ba4903a2a46af290abe078e426f913e492b8d9b997232dbe6198aea719a31e73b40e110c4efa9e42d737a42883e0ca5f344d02", - return_code::success - }, - - //test (invalid field element, should fail) - { - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - return_code::failure - }, + //test (valid field element) + { + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "c4eeedff9d75fa9b8fd2dd02d763e6da336b8a0cd5c7164c5dffadb719735838b794b1ade1cd180b96c668208f8dfb00ecae7875aaca56ec495d92aa34bc52d9322bc310eea68f0c31d1af89a5d02a9c678c72e38737bdb773c7780d91f06205687481c64b51db898dae924db9c925889c3982512d6ed2fff5603695e0f02d95fbc6906a9eaeec6e073f9a39b318c206", + return_code::success + }, + { + "6de1c03023f2b4e454559b97266ebc1f96cd5510c4f48e2acafbe73a536a1477f2c8d1c9b5f6615d01968ea59ef4fd07", + "e0a482315373675926a671cf7b6713e386be3a0b9daff70aff0c00280d9cc89cb71b11348e1dc9287d0e0c8ba0ff880935d6d7f42bea93a3aeb042b25eb8032cea0398c21be52eeefca4e303e9851fb511358e1e2924a68cc82009b4114c8800ceb889478e18ab51d4c202caea0db6dec07103307e95b55fe40f02fd441bc64cd7a352daf77de4b8ee643c26bd941c13", + return_code::success + }, + { + "d2e51018d97c13b16f9ad81abb6197f8368434b501c6f8b2d690fef722d806f49cb469d61f4bed69a124f8db3aab7512", + "2e324e790bf2eaed08c841facb268ad531db92785f8673478dff9943691d87eefbb2dea440106ba077903accdb0636033cfeec3c71157ec44b48db4d02ed7a027c705425f2ca27e9ecbb4ae71d019c841c90b616fce8ce93f96ba488a1f0be088014a79ae95bfcb2321d7c164bc8bae45c69703ad22eb90446841b5a7b64221d72c66a3be502380e6113fb79b73a2a14", + return_code::success + }, + { + "094956e84809a27f467de542a0149629866eb5b9ec353e267b0bef3e0836effe055c6f85278857b8846dde301dd1930e", + "9f97704a2c4f6b91a6b54d10dbde430d68ab991136d825fa637757fbac7fb3a6c957e22bb33fde456ff0173c5e37530c04da881b4cab754d3635628d8897b1eb0edfa4f42f96e8f9d9508de9c8e4e84997f49e00dd5e1714e2acaeb51e0d9110ab5a6e6aa0dfe302b69e8d98e340e41bd5b4ffe001104bd7cf70fb9f7166fdcf0b4a9159add28f694124bcaca527f817", + return_code::success + }, + { + "3a1acb866b91c2cb46858c70509b9789363b34479bbd65e216c9d91c52512a63464decd8e60bd27470d1551148415a01", + "210606d6d1c43825ed042049b2e194cf699c5846a29693a1bb9aab1cfd75561e2a76c29b16d2b4f5d19d9dbfb128ee17e33ffe21e4c8c8be42bb756daacf8d5b1bb0c9491c417791b22e76ff8b70a3f4593de13a60dc89e33726fd5f4885c3170fb43004347c5be08adf622325a7251d9f0f1159769ebec8a0db1a6df5d95c166be6d7d8c112ce6d64457ddb4ce6bf16", + return_code::success + }, + + //test (invalid field element, should fail) + { + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::failure + }, }; for(const auto& test : tests) { @@ -477,19 +553,38 @@ BOOST_AUTO_TEST_CASE( bls_testg2map ) { try { using test_add = std::tuple; const std::vector tests = { - //test (valid field element) - { - "d4f2cfec99387809574fcc2dba105603d950d490e2bebe0c212c05e16b784745ef4fe8e70b554d0a52fe0bed5ea6690ade2348eb8972a96740a430df162d920e175f5923a76d18650ea24a8ec06d414c6d1d218d673dac3619a1a5c142785708", - "9968ae9e9bf3d22ec6c9670efa64ea23d4966b41bb25f76ea2ef71b96fa35e031adb866b3df234065b9aa72d0b12ab14978678279eb944f05b5af53d91e700b57aa87076727def2e9f2fba3cf6784a25591ae1669c2cf15cdcf038b826d1e81178bd7b59b7e911e0c2d11d6805756222201e3364f8010fb651939eca63f7e77709042ee1030cd938f53905a714e815112a7dfeed207757d30382f69617014bc683a175d0dfbd74f2684de26c771f3f55a538e6d2f969eb282bddfec4fc08dd18f37df0889292f288dff631b02f07b88134410fd86526d234d75b9a329bc9a8b6e71c7ad516b87af9717d962cba5d2b19fd1b77746f1e484a54e6aec81ede148f01e2c8283c598a4976182d2ce287fe6888e23996ce03b03ce6709e4aa8e66416", - return_code::success - }, - - //test (invalid field element, should fail) - { - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - return_code::failure - }, + //test (valid field element) + { + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "2cc320eb83394cab86cfcb2aca98ee59c89adc82a2ffe8c4fcd240bc065aa174a5beb4712d6858743395b9ca92403419dffd1c5ba35a4adcb76ce228e7b3811c79f7c7176a9bd2bebf0b69a2f6748e0026a111265c5f41f86ff25aa9c4603207d4fa8db63db7c467ac4b745e4772b2126cbf2b8b39d1e86f48b4226cd6e858ca41e9683208831680f4c541b8d69810138c08a55c4de86d52e6c81cb10a89c8a09076792a4e923f0642600b11f3d66359100cffacb11cc67db3c1aeeb0dfc98143aaac9a85894082ac034829392dfc109df5a4e5e60834a2b77b4b137f33987cb2144463019d81245b08de156352b8a13c25e15d1288382ba2ec9832dcc21ba0ea56f6d2864ee902ccaa4b363edf438326aaef5d934d81f86c2dc2581b0eaa111", + return_code::success + }, + { + "1449dbb73bbcb48b3b752e02dfa0edb5ede9419d8b601d3caf6d4298447b1db2fad35b44e4203eb885f3ad27785d770eca5e3e2d0530cf2d49254ead13700b8277167500205e7f30efce24ae70d4b1fb160aa7ca820ce7b767a21b7107bc5f02", + "e84dd939150d71b3b43d46434f7f1f77a0e0c61c8110ed5cffd98289f2d81146d8d59f0e9b16dcb774d9cd65ffd81b00992d503294aaef09fdd3af0daf143d3bbb0032606e07655fbb5f460ae0e46883b008c7227174609201df62fbaf8ba207df50029d418e33954690de92c5b8ac306523a11e782d2c55678b787fae3d52f286aed0fd5ffa083fc5e1d1a1ac704908b8eaa5c7ed9a5b3d6434932a5804cf9903d09f0b1fdfc7d730a1421d3231f505205e4bbd65e73140205767a1cf3ef719a3913387a3e9ea4402fb28036d44884bd7404fcf4f939a2a12191ecc910682a4b86624fd1c77958de393800e81c757190f96bb7123c76a549b6df5a035feb584164e88031d89451516f9b4a085e71cd91b442e72d8bfee79b61f36f3363c3309", + return_code::success + }, + { + "db4f64b6ead6e1a545fc454e24f0ee0cc9335ee6ee1b8eb70550c8d32312cd663a064fb651284b7cbaa8b5e41cb35a04cbbd1c96af164e0a97ce331daacd180ff7d3308d364aa956799902525dbf4180590fb246355a0174eb1d2afddba77018", + "cfbdbf3b9a0ba68429054cad7effe4343d9d559e2c8433515b54f59442ade90df79c19280b0e9268a8a3d7221f6df606ce984a0737b381d10af7af93cc231de97ed6de5ba4a3e42f3d6ddd997a0e989db4e3a945bd19ef7ba0e2da377ddef40eb2f45ce6da09cfc2af45d299e368d4ba819d10f98a3275bb2438a733f4050cba51770b4fbc4b9124595d318e3042850e31228e8d3e09cbe9340a4837311f4a788c8f74c354096f195a19555d7fa6329b04bad93126fdd3b94874bf7993495809df0b7da1214ea8807b3911e1aca7f1f2158153d04386f3d47d47df7dcb1b4b1a8915f125936a64a009f3a6c0070e81167c30f706c396c5eb6eb86120d4e8ea3c961016afa082c18ed86ff426d193755c7e3ab39735911a93b2c015619319e510", + return_code::success + }, + { + "b4108d552274d175fd4e52dd766ff396a4f365c102e0ef7b4d266f220ec67eefab48ac15d1db0d98ba31cda435616e0bdeb51952b044ce0f64b5d42199d9560ed0175f3d2c58af07909d29db4480c1b417dfbf7f1af274648adb54b029e38f08", + "5fb1388da7918ccd909f866d15e0211a82048237e02d977f20543ac40ac93de2ccff2211ea443aefd839a5b1e9518b0eb8e639157aaff319ef48a1b47d764b10711615230dffc2c6740b382a0ef25a751ec8fd98d2f44161bbe10f0fae62cd1962caf7d08ca08638403fc28094e46143a23aff4238cfbe85a893fd5cf339fbf241880136dfe3160e74faf6349dee7106ba97a567e770f6ef6e3ee2571d958ea7ce323506808d015d3d1fa22b41027fc57b247a89bbf85e87bc4bab5fd78fc103844e484f2c5cf3ebf62015b6d4390058a017c5cd072240acbaf0d962da5beefd9b574359427071ded658cfa878defd14fc42998afa44557c7370903ed6b34513790e586950c1488155a4fa162462ca098e4016c3c403ba386d0d8d2435e44014", + return_code::success + }, + { + "7e4dda81ee149d8b6b43a1a89c6f80d07b5fa93bff73215bd3c8677c671348b477a8912deba95a298574d64706b5450fb6fb07b9be96d4b87d677eeab47bc473ad7dc44c286b9e63b949ac64fb5b56e09638f48847238c18c1e4056aa616df03", + "0747e844852618f18f528be3267dc11c728c2b0b7f6fddfc240971949c5903147cdb2e5791851f792c5822237793921053736a50d7719c2421dd58ae2c26aed85f8330123c395b6e18dd760327240b875de65237c33e341afc5b877398e81518cd827ebcfd2083756ef1e4150d8276bbc2025c8c01bcff1fc24f57090a34211d62d50b7d5df29a3eeaadb10d0db91919cb03f8fde38e858599d3e3a01670a1ac4d11f9b2eeaa3d109e4fac1e9707f420fe34bb97efd94ad874150b9a5f512719e2bfcb1784b834b17f33552846bf6f8edb4817764a9fede0f29806484f0270ec612752f967a095bd94137d0402384900d40f85d23b50c35994ff0b7268e89f207cb9fcc786d944e522571ec86b621bb96cea8fd6519c623c54a210c23ad66400", + return_code::success + }, + //test (invalid field element, should fail) + { + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::failure + }, }; for(const auto& test : tests) { @@ -525,20 +620,20 @@ BOOST_AUTO_TEST_CASE( bls_empty ) { try { c.produce_block(); //expected return is g1::zero(), which is x=0, y=1, z=0. 1 here means fp::R1 - c.push_action( tester1_account, "testg1exp"_n, tester1_account, mutable_variant_object() + c.push_action( tester1_account, "testg1wsum"_n, tester1_account, mutable_variant_object() ("points", std::vector()) ("scalars", std::vector()) ("num", 0) - ("res", hex2bin("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FDFF02000000097602000CC40B00F4EBBA58C7535798485F455752705358CE776DEC56A2971A075C93E480FAC35EF615000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")) + ("res", hex2bin("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")) ("expected_error", (int32_t)return_code::success) ); //expected return is g2::zero(), which is x=0, y=1, z=0. 1 here means fb2::one(), {fp::R1, 0} - c.push_action( tester1_account, "testg2exp"_n, tester1_account, mutable_variant_object() + c.push_action( tester1_account, "testg2wsum"_n, tester1_account, mutable_variant_object() ("points", std::vector()) ("scalars", std::vector()) ("num", 0) - ("res", hex2bin("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FDFF02000000097602000CC40B00F4EBBA58C7535798485F455752705358CE776DEC56A2971A075C93E480FAC35EF615000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")) + ("res", hex2bin("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")) ("expected_error", (int32_t)return_code::success) ); @@ -547,7 +642,7 @@ BOOST_AUTO_TEST_CASE( bls_empty ) { try { ("g1_points", std::vector()) ("g2_points", std::vector()) ("num", 0) - ("res", hex2bin("FDFF02000000097602000CC40B00F4EBBA58C7535798485F455752705358CE776DEC56A2971A075C93E480FAC35EF615000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")) + ("res", hex2bin("010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")) ("expected_error", (int32_t)return_code::success) ); diff --git a/unittests/test-contracts/bls_primitives_test/bls_primitives_test.abi b/unittests/test-contracts/bls_primitives_test/bls_primitives_test.abi index 27713f8b5b..1e04dc2e5a 100644 --- a/unittests/test-contracts/bls_primitives_test/bls_primitives_test.abi +++ b/unittests/test-contracts/bls_primitives_test/bls_primitives_test.abi @@ -25,32 +25,6 @@ } ] }, - { - "name": "testg1exp", - "base": "", - "fields": [ - { - "name": "points", - "type": "bytes" - }, - { - "name": "scalars", - "type": "bytes" - }, - { - "name": "num", - "type": "uint32" - }, - { - "name": "res", - "type": "bytes" - }, - { - "name": "expected_error", - "type": "int32" - } - ] - }, { "name": "testg1map", "base": "", @@ -70,17 +44,21 @@ ] }, { - "name": "testg1mul", + "name": "testg1wsum", "base": "", "fields": [ { - "name": "point", + "name": "points", "type": "bytes" }, { - "name": "scalar", + "name": "scalars", "type": "bytes" }, + { + "name": "num", + "type": "uint32" + }, { "name": "res", "type": "bytes" @@ -113,32 +91,6 @@ } ] }, - { - "name": "testg2exp", - "base": "", - "fields": [ - { - "name": "points", - "type": "bytes" - }, - { - "name": "scalars", - "type": "bytes" - }, - { - "name": "num", - "type": "uint32" - }, - { - "name": "res", - "type": "bytes" - }, - { - "name": "expected_error", - "type": "int32" - } - ] - }, { "name": "testg2map", "base": "", @@ -158,17 +110,21 @@ ] }, { - "name": "testg2mul", + "name": "testg2wsum", "base": "", "fields": [ { - "name": "point", + "name": "points", "type": "bytes" }, { - "name": "scalar", + "name": "scalars", "type": "bytes" }, + { + "name": "num", + "type": "uint32" + }, { "name": "res", "type": "bytes" @@ -212,19 +168,14 @@ "type": "testg1add", "ricardian_contract": "" }, - { - "name": "testg1exp", - "type": "testg1exp", - "ricardian_contract": "" - }, { "name": "testg1map", "type": "testg1map", "ricardian_contract": "" }, { - "name": "testg1mul", - "type": "testg1mul", + "name": "testg1wsum", + "type": "testg1wsum", "ricardian_contract": "" }, { @@ -232,19 +183,14 @@ "type": "testg2add", "ricardian_contract": "" }, - { - "name": "testg2exp", - "type": "testg2exp", - "ricardian_contract": "" - }, { "name": "testg2map", "type": "testg2map", "ricardian_contract": "" }, { - "name": "testg2mul", - "type": "testg2mul", + "name": "testg2wsum", + "type": "testg2wsum", "ricardian_contract": "" }, { diff --git a/unittests/test-contracts/bls_primitives_test/bls_primitives_test.cpp b/unittests/test-contracts/bls_primitives_test/bls_primitives_test.cpp index faea7638a6..413e8745d5 100644 --- a/unittests/test-contracts/bls_primitives_test/bls_primitives_test.cpp +++ b/unittests/test-contracts/bls_primitives_test/bls_primitives_test.cpp @@ -33,40 +33,10 @@ void bls_primitives_test::testg2add(const std::vector& op1, const std:: check(0 == std::memcmp(r, res.data(), sizeof(bls_g2)), "bls_g2_add: Result does not match"); } -void bls_primitives_test::testg1mul(const std::vector& point, const std::vector& scalar, const std::vector& res, int32_t expected_error) +void bls_primitives_test::testg1wsum(const std::vector& points, const std::vector& scalars, const uint32_t num, const std::vector& res, int32_t expected_error) { bls_g1 r; - int32_t error = internal_use_do_not_use::bls_g1_mul( - reinterpret_cast(point.data()), - sizeof(bls_g1), - reinterpret_cast(scalar.data()), - sizeof(bls_scalar), - reinterpret_cast(r), - sizeof(bls_g1) - ); - check(error == expected_error, "bls_g1_mul: Error does not match"); - check(0 == std::memcmp(r, res.data(), sizeof(bls_g1)), "bls_g1_mul: Result does not match"); -} - -void bls_primitives_test::testg2mul(const std::vector& point, const std::vector& scalar, const std::vector& res, int32_t expected_error) -{ - bls_g2 r; - int32_t error = internal_use_do_not_use::bls_g2_mul( - reinterpret_cast(point.data()), - sizeof(bls_g2), - reinterpret_cast(scalar.data()), - sizeof(bls_scalar), - reinterpret_cast(r), - sizeof(bls_g2) - ); - check(error == expected_error, "bls_g2_mul: Error does not match"); - check(0 == std::memcmp(r, res.data(), sizeof(bls_g2)), "bls_g2_mul: Result does not match"); -} - -void bls_primitives_test::testg1exp(const std::vector& points, const std::vector& scalars, const uint32_t num, const std::vector& res, int32_t expected_error) -{ - bls_g1 r; - int32_t error = internal_use_do_not_use::bls_g1_exp( + int32_t error = internal_use_do_not_use::bls_g1_weighted_sum( reinterpret_cast(points.data()), num * sizeof(bls_g1), reinterpret_cast(scalars.data()), @@ -79,10 +49,10 @@ void bls_primitives_test::testg1exp(const std::vector& points, const st check(0 == std::memcmp(r, res.data(), sizeof(bls_g1)), "bls_g1_exp: Result does not match"); } -void bls_primitives_test::testg2exp(const std::vector& points, const std::vector& scalars, const uint32_t num, const std::vector& res, int32_t expected_error) +void bls_primitives_test::testg2wsum(const std::vector& points, const std::vector& scalars, const uint32_t num, const std::vector& res, int32_t expected_error) { bls_g2 r; - int32_t error = internal_use_do_not_use::bls_g2_exp( + int32_t error = internal_use_do_not_use::bls_g2_weighted_sum( reinterpret_cast(points.data()), num * sizeof(bls_g2), reinterpret_cast(scalars.data()), diff --git a/unittests/test-contracts/bls_primitives_test/bls_primitives_test.hpp b/unittests/test-contracts/bls_primitives_test/bls_primitives_test.hpp index 7af146e94e..5ca936225a 100644 --- a/unittests/test-contracts/bls_primitives_test/bls_primitives_test.hpp +++ b/unittests/test-contracts/bls_primitives_test/bls_primitives_test.hpp @@ -19,16 +19,10 @@ namespace eosio { int32_t bls_g2_add(const char* op1, uint32_t op1_len, const char* op2, uint32_t op2_len, char* res, uint32_t res_len); __attribute__((eosio_wasm_import)) - int32_t bls_g1_mul(const char* point, uint32_t point_len, const char* scalar, uint32_t scalar_len, char* res, uint32_t res_len); + int32_t bls_g1_weighted_sum(const char* points, uint32_t points_len, const char* scalars, uint32_t scalars_len, uint32_t n, char* res, uint32_t res_len); __attribute__((eosio_wasm_import)) - int32_t bls_g2_mul(const char* point, uint32_t point_len, const char* scalar, uint32_t scalar_len, char* res, uint32_t res_len); - - __attribute__((eosio_wasm_import)) - int32_t bls_g1_exp(const char* points, uint32_t points_len, const char* scalars, uint32_t scalars_len, uint32_t n, char* res, uint32_t res_len); - - __attribute__((eosio_wasm_import)) - int32_t bls_g2_exp(const char* points, uint32_t points_len, const char* scalars, uint32_t scalars_len, uint32_t n, char* res, uint32_t res_len); + int32_t bls_g2_weighted_sum(const char* points, uint32_t points_len, const char* scalars, uint32_t scalars_len, uint32_t n, char* res, uint32_t res_len); __attribute__((eosio_wasm_import)) int32_t bls_pairing(const char* g1_points, uint32_t g1_points_len, const char* g2_points, uint32_t g2_points_len, uint32_t n, char* res, uint32_t res_len); @@ -56,16 +50,10 @@ class [[eosio::contract]] bls_primitives_test : public eosio::contract { void testg2add(const std::vector& op1, const std::vector& op2, const std::vector& res, int32_t expected_error); [[eosio::action]] - void testg1mul(const std::vector& point, const std::vector& scalar, const std::vector& res, int32_t expected_error); - - [[eosio::action]] - void testg2mul(const std::vector& point, const std::vector& scalar, const std::vector& res, int32_t expected_error); - - [[eosio::action]] - void testg1exp(const std::vector& points, const std::vector& scalars, const uint32_t num, const std::vector& res, int32_t expected_error); + void testg1wsum(const std::vector& points, const std::vector& scalars, const uint32_t num, const std::vector& res, int32_t expected_error); [[eosio::action]] - void testg2exp(const std::vector& points, const std::vector& scalars, const uint32_t num, const std::vector& res, int32_t expected_error); + void testg2wsum(const std::vector& points, const std::vector& scalars, const uint32_t num, const std::vector& res, int32_t expected_error); [[eosio::action]] void testpairing(const std::vector& g1_points, const std::vector& g2_points, const uint32_t num, const std::vector& res, int32_t expected_error); diff --git a/unittests/test-contracts/bls_primitives_test/bls_primitives_test.wasm b/unittests/test-contracts/bls_primitives_test/bls_primitives_test.wasm index 2e2520689316f62637d309e379cb39295bab1c17..037e98a7c6646783ef986d238283d3b0d478bff4 100755 GIT binary patch delta 1252 zcmb_aJ!n%=7`?wQKR2&=P2NkI7j0f+ng&5>n}UiWd5VSVAf24FD3<;hrPA7>OS9EM z#P)L&O9e#*2emp#9g-$G=%QAzQ&qGsI@H0zLF#)+6B-OC*gJd|&b^#-zVm(WTYn_3 z4A5KDKbhXO-G3rI+|$?AGuAuM*FVyGvS;|*X+&x7nbFcqd)3Q>PkZqZO+~`tk&#E1 z>twG)yv4&f9>N%NiV>CqbR3(REE40$d|Ien4j1OfhlbMUk?MXMQ5jMi!~{VGQZ^}m zxIn_=jeK7wGxOq7Zh7&bLAqJWKn7NtZ1m0ZpV=xjT0);x|J`Dt_ZQ}_FML_g5G(RN z{#?z_TtaVF7$8MCjzcGnU?23;9ZsJR!bHmE+1u2EaR45%m=qKoDFT+*)_^n056Fn5 zNXp=5hIPrv;7S0#3mv;)TJFFRFg;|sRB~4ff9r@Nx~q8WXZYVtm6(2f$r?KXw%NP z(1ll6nTC;=gjR3pe_c+yDlV_(YPjr@WB)9%7D2Awjv!K(_#>2UjE@)$c8f$gnWb8q z&E5^vjKZiAf_I+AvgD2V8g1hG4V2u|!aIv|&(B*E71sVx^A#F2Xo4tamMLpnv0Tf@ zlJ74@Ce)<0a&xL4j_5XXg6y7k;mwT3IIJ%fk-xJxQoxtNEKeyyCr-F#IB z?dk@KN?J>cqa^w=U+F(v?tg}q`~SAiM4c|IkUo&X7!u+cgR9zM@|D7}HVmr)4)LHq M`zvq^vs4tJ-<`iD;Q#;t delta 1684 zcmcIlOK1~87@nDZB%9eywrTTdk~WhV(^x#TwpdgsO{Ib!lwJi}6iP9~T4)s&wCTl@ zNXxHKkV+1|ZdOW9MMxh3U-+O3)r&o}UPO(ecV~B-HmL=L);-MZeDm-Bef$0MGrtla z8%9nGQ-WtSy|2}ADm~EM+t_{PTpD4ar|-N4?AZu3cK2N9M?z@?2Ocf7VzqmA|yOCn@4mAC5_3ZVCiIkfBGWwI_|~2BGLnNiXevcTHV7C!<}MVdnS{8 z_9C~kc!UwYG*F#MCVFkA4BcU(Z&%7=V-|Y17&~O8*lEIF-jxT(E%atF*ov*==)}VG z_`;`B5eYMPYPmeaE(^U=o}pf1h)d>A4%~uAsG<}SLW`ZxG>P=^WUruN?1w=yCRbAl z=^ES?>%ESs)S)5LM%tK^%!r3I#3bDhVMhQ{*zah@5jg7zl1KoCodLecseUq+hm7RG zDiqWJOh`?NkEckYsddBid#|$Ni7?CL> zOy-0tG}<2EAbhZO^0d3{aeIimC@)eC9JhzIF0xBm6M1W9qewMGnUE}yR1DD(C@9ri z=bMle%%FoNun+oZwA2!dZ3$a!C+yq6)}OP%2FGjv=rAUv*6>l91cn@yyx7wt!hG^g3IOJ>K?=MprykCE>p47&#eewo0P i%AjoBE0C?Mk<1Il0D)DBgzsl7!;?SVm$CRHiqLPlREKE* From 9c42d4248e4dccae0f2edc6f9214a62794afa0f2 Mon Sep 17 00:00:00 2001 From: yarkin Date: Mon, 13 Nov 2023 20:34:44 +0800 Subject: [PATCH 06/24] Fix comile. --- .../eosio/chain/webassembly/eos-vm-oc/intrinsic_mapping.hpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/libraries/chain/include/eosio/chain/webassembly/eos-vm-oc/intrinsic_mapping.hpp b/libraries/chain/include/eosio/chain/webassembly/eos-vm-oc/intrinsic_mapping.hpp index ee12edeb7d..2ea5bc5a03 100644 --- a/libraries/chain/include/eosio/chain/webassembly/eos-vm-oc/intrinsic_mapping.hpp +++ b/libraries/chain/include/eosio/chain/webassembly/eos-vm-oc/intrinsic_mapping.hpp @@ -287,9 +287,7 @@ inline constexpr auto get_intrinsic_table() { "env.bls_g2_map_mont", "env.bls_fp_mod_mont", "env.bls_fp_mul_mont", - "env.bls_fp_exp_mont", - - + "env.bls_fp_exp_mont" ); } inline constexpr std::size_t find_intrinsic_index(std::string_view hf) { From 49d17e30bd777bf559e344641084a82ac8f18674 Mon Sep 17 00:00:00 2001 From: yarkin Date: Tue, 14 Nov 2023 15:55:17 +0800 Subject: [PATCH 07/24] Update to use affine form instead of jacobian form for data serialization. --- libraries/chain/webassembly/crypto.cpp | 50 ++-- unittests/bls_primitives_tests.cpp | 218 +++++++++--------- .../bls_primitives_test.hpp | 4 +- .../bls_primitives_test.wasm | Bin 5237 -> 5237 bytes 4 files changed, 136 insertions(+), 136 deletions(-) diff --git a/libraries/chain/webassembly/crypto.cpp b/libraries/chain/webassembly/crypto.cpp index f1a41fcb4e..68555af367 100644 --- a/libraries/chain/webassembly/crypto.cpp +++ b/libraries/chain/webassembly/crypto.cpp @@ -27,43 +27,43 @@ namespace { using eosio::chain::webassembly::return_code; int32_t bls_g1_add_impl(span op1, span op2, span result, bool mont) { - if(op1.size() != 144 || op2.size() != 144 || result.size() != 144) + if(op1.size() != 96 || op2.size() != 96 || result.size() != 96) return return_code::failure; - std::optional a = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)op1.data(), 144), true, mont); - std::optional b = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)op2.data(), 144), true, mont); + std::optional a = bls12_381::g1::fromAffineBytesLE(std::span((const uint8_t*)op1.data(), 96), true, mont); + std::optional b = bls12_381::g1::fromAffineBytesLE(std::span((const uint8_t*)op2.data(), 96), true, mont); if(!a || !b) return return_code::failure; bls12_381::g1 c = a->add(*b); - c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 144), mont); + c.toAffineBytesLE(std::span((uint8_t*)result.data(), 96), mont); return return_code::success; } int32_t bls_g2_add_impl(span op1, span op2, span result, bool mont) { - if(op1.size() != 288 || op2.size() != 288 || result.size() != 288) + if(op1.size() != 192 || op2.size() != 192 || result.size() != 192) return return_code::failure; - std::optional a = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)op1.data(), 288), true, mont); - std::optional b = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)op2.data(), 288), true, mont); + std::optional a = bls12_381::g2::fromAffineBytesLE(std::span((const uint8_t*)op1.data(), 192), true, mont); + std::optional b = bls12_381::g2::fromAffineBytesLE(std::span((const uint8_t*)op2.data(), 192), true, mont); if(!a || !b) return return_code::failure; bls12_381::g2 c = a->add(*b); - c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 288), mont); + c.toAffineBytesLE(std::span((uint8_t*)result.data(), 192), mont); return return_code::success; } int32_t bls_g1_weighted_sum_impl(span points, span scalars, const uint32_t n, span result, const std::function& yield, bool mont) { - if(points.size() != n*144 || scalars.size() != n*32 || result.size() != 144) + if(points.size() != n*96 || scalars.size() != n*32 || result.size() != 96) return return_code::failure; // Use much efficient scale for the special case of n == 1. if (1 == n) { - std::optional a = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)points.data(), 144), true, mont); + std::optional a = bls12_381::g1::fromAffineBytesLE(std::span((const uint8_t*)points.data(), 96), true, mont); if(!a) return return_code::failure; std::array b = bls12_381::scalar::fromBytesLE<4>(std::span((uint8_t*)scalars.data(), 32)); bls12_381::g1 c = a->scale(b); - c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 144), mont); + c.toAffineBytesLE(std::span((uint8_t*)result.data(), 96), mont); return return_code::success; } @@ -73,7 +73,7 @@ namespace { sv.reserve(n); for(uint32_t i = 0; i < n; i++) { - std::optional p = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)points.data() + i*144, 144), true, mont); + std::optional p = bls12_381::g1::fromAffineBytesLE(std::span((const uint8_t*)points.data() + i*96, 96), true, mont); if(!p.has_value()) return return_code::failure; std::array s = bls12_381::scalar::fromBytesLE<4>(std::span((const uint8_t*)scalars.data() + i*32, 32)); @@ -83,23 +83,23 @@ namespace { yield(); } bls12_381::g1 r = bls12_381::g1::weightedSum(pv, sv, yield); // accessing value is safe - r.toJacobianBytesLE(std::span((uint8_t*)result.data(), 144), mont); + r.toAffineBytesLE(std::span((uint8_t*)result.data(), 96), mont); return return_code::success; } int32_t bls_g2_weighted_sum_impl(span points, span scalars, const uint32_t n, span result, const std::function& yield, bool mont) { - if(points.size() != n*288 || scalars.size() != n*32 || result.size() != 288) + if(points.size() != n*192 || scalars.size() != n*32 || result.size() != 192) return return_code::failure; // Use much efficient scale for the special case of n == 1. if (1 == n) { - std::optional a = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)points.data(), 288), true, mont); + std::optional a = bls12_381::g2::fromAffineBytesLE(std::span((const uint8_t*)points.data(), 192), true, mont); if(!a) return return_code::failure; std::array b = bls12_381::scalar::fromBytesLE<4>(std::span((uint8_t*)scalars.data(), 32)); bls12_381::g2 c = a->scale(b); - c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 288), mont); + c.toAffineBytesLE(std::span((uint8_t*)result.data(), 192), mont); return return_code::success; } @@ -109,7 +109,7 @@ namespace { sv.reserve(n); for(uint32_t i = 0; i < n; i++) { - std::optional p = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)points.data() + i*288, 288), true, mont); + std::optional p = bls12_381::g2::fromAffineBytesLE(std::span((const uint8_t*)points.data() + i*192, 192), true, mont); if(!p) return return_code::failure; std::array s = bls12_381::scalar::fromBytesLE<4>(std::span((const uint8_t*)scalars.data() + i*32, 32)); @@ -119,20 +119,20 @@ namespace { yield(); } bls12_381::g2 r = bls12_381::g2::weightedSum(pv, sv, yield); // accessing value is safe - r.toJacobianBytesLE(std::span((uint8_t*)result.data(), 288), mont); + r.toAffineBytesLE(std::span((uint8_t*)result.data(), 192), mont); return return_code::success; } int32_t bls_pairing_impl(span g1_points, span g2_points, const uint32_t n, span result, const std::function& yield, bool mont) { - if(g1_points.size() != n*144 || g2_points.size() != n*288 || result.size() != 576) + if(g1_points.size() != n*96 || g2_points.size() != n*192 || result.size() != 576) return return_code::failure; std::vector> v; v.reserve(n); for(uint32_t i = 0; i < n; i++) { - std::optional p_g1 = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)g1_points.data() + i*144, 144), true, mont); - std::optional p_g2 = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)g2_points.data() + i*288, 288), true, mont); + std::optional p_g1 = bls12_381::g1::fromAffineBytesLE(std::span((const uint8_t*)g1_points.data() + i*96, 96), true, mont); + std::optional p_g2 = bls12_381::g2::fromAffineBytesLE(std::span((const uint8_t*)g2_points.data() + i*192, 192), true, mont); if(!p_g1 || !p_g2) return return_code::failure; bls12_381::pairing::add_pair(v, *p_g1, *p_g2); @@ -146,25 +146,25 @@ namespace { int32_t bls_g1_map_impl(span e, span result, bool mont) { - if(e.size() != 48 || result.size() != 144) + if(e.size() != 48 || result.size() != 96) return return_code::failure; std::optional a = bls12_381::fp::fromBytesLE(std::span((const uint8_t*)e.data(), 48), true, mont); if(!a) return return_code::failure; bls12_381::g1 c = bls12_381::g1::mapToCurve(*a); - c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 144), mont); + c.toAffineBytesLE(std::span((uint8_t*)result.data(), 96), mont); return return_code::success; } int32_t bls_g2_map_impl(span e, span result, bool mont) { - if(e.size() != 96 || result.size() != 288) + if(e.size() != 96 || result.size() != 192) return return_code::failure; std::optional a = bls12_381::fp2::fromBytesLE(std::span((const uint8_t*)e.data(), 96), true, mont); if(!a) return return_code::failure; bls12_381::g2 c = bls12_381::g2::mapToCurve(*a); - c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 288), mont); + c.toAffineBytesLE(std::span((uint8_t*)result.data(), 192), mont); return return_code::success; } diff --git a/unittests/bls_primitives_tests.cpp b/unittests/bls_primitives_tests.cpp index d3628270b4..e08bedf25d 100644 --- a/unittests/bls_primitives_tests.cpp +++ b/unittests/bls_primitives_tests.cpp @@ -47,34 +47,34 @@ BOOST_AUTO_TEST_CASE( bls_testg1add ) { try { const std::vector tests = { { // g1::zero() - "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", return_code::success }, { // g1::one() - "bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f117e1e7c5462923aa0ce48a88a244c73cd0edb3042ccb18db00f60ad0d595e0f5fce48a1d74ed309ea0f1a0aae381f4b308010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f117e1e7c5462923aa0ce48a88a244c73cd0edb3042ccb18db00f60ad0d595e0f5fce48a1d74ed309ea0f1a0aae381f4b308010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "cb6c84ef58874b297a148a7d0d8d070c305444bae71188052edcc647fe820672b44c589288a3b06f6789d417ce6f4a03a57cdfb1e1d8a42a8aa4bea182879a59bd0d6a0baf525939c92b3ebb003a09d601fce510044c603cbc026d6029b4e414c2cf8b8d52465419c8151145898e79a0db6709589631b601ec15a0ab2bc1ebf9c9153be8da613c41e34155c703e96711", + "bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f117e1e7c5462923aa0ce48a88a244c73cd0edb3042ccb18db00f60ad0d595e0f5fce48a1d74ed309ea0f1a0aae381f4b308", + "bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f117e1e7c5462923aa0ce48a88a244c73cd0edb3042ccb18db00f60ad0d595e0f5fce48a1d74ed309ea0f1a0aae381f4b308", + "4e0fbf29558c9ac3427c1c8fbb758fe22aa658c30a2d90432501289130db21970c45a950ebc8088846674d90eacb7205289d7479198886ba1bbd16cdd4d9564c6ad75f1d02b93bf761e47086cb3eba22388e9d7773a6fd22a373c6ab8c9d6a16", return_code::success }, { - "ceee6c9e1a6c228ba221ad93d4ad4d9e8833ebd4eab43c2279d466527534e693cab7d47c38fe5076527cabf553f7f0023c8fdda7c9a557ed67f00f5e763db42d32453b6c972c9730d62727ee7db1d942bd8571a15d5e7ac99c3f2638e1b05411b8a4a182986ddfe60025618808971865b1703dbca5b54534a798e75133c248b33b9865140c0f1c6ccf6c3b3848086618", - "4a3f2830b025929c35ab4ca952022d894576c83c172a2b5dcad0592de56ccb3fe0d79173ffb7d9b3a9d25dcf4690fe1022b3d371c42a40922fad5f35d1425d19754b1380e0c6ab26ce5235bb80482c6f344d0282e9fd11d63a522afdb3653b02dcb2764444c4b40cfa8dd409e6ceab3afabd6edbce62fefced034fa86bf1e9a72f71c955d23a2e8cb88e21c59d155218", - "fa9192b3dd85b569b2b3b7bd35f284b010fbd56a0e1f3fa08ec53406c237d3992888ef51c8db752d3ae401c9ad1dd80e114759044d3f0562db401fb338fa91a47d7ee4c8e113fb57b2fc42a7f595b8d49b35c897ef208ef16fd64e2dbe2db8029bdd5d6e8c565db6e1c404e47570a7a21804d3bdb2fe96411b5ab163df24e000bf8f5135a0d46e067ffa1745e89e810b", + "aa83970268d80b50a68535d920954bd993217b9114cbe255e5c0b64e748c5683b6518071552148ec555cdb8fed0f07001e76e62761e8d828a74b81f216a0c5ebeb923550cafd110512cec20e33ec9b272c0ff2b88215953945153fc926691506", + "e810c1d6ac7cbae0157a0fc958ef607c33e03dee20e72a97ae72de0dd9a0ef20d768ab4b659429255b87feda0be194062a77cd664976e6560b33c921d5968c19a5d5ae9e38c909690975c084c0a4e82481b01e4023b83d6a8ddcb9d38892f50f", + "145cae227562a69bbf270b8ec8d1783bed4ad0fd43e9c81ac5caa7d3e7feaa3acda07d6033ece1f7f0649d6b75009a03e83ab8f9b44f94c4ab762611266b7a530ce05092ad38b7554a95caa2b63ad0969a902d69f34531dbccf8a4f2e12cf60d", return_code::success }, { - "a955a224f5bfc2e6866dbd1c09cae3f2c9e2d68f195b642e765b0ade563c877013fcf97c79746ed5e8fe7ad6928ffa15b5adc82611544ec3ad79b715a071478afb3a851bd9c8b20011b259892400527ca3de3944c46e9f3c478fa5d3f28a89118b8e8784500c6dc1cefc4fb3b0f1f809876d1d9cbabcf753ceb39f6cf4a4b5e47c04c6d04eefadf8088c07790b110310", - "f821e4f80f1e4f1d6011fbf07af24d377f7d6921b05c73ab6b6c8af8797505f3e9744f6a7c681a33e2f8815bf76aae16f975b623031db553e59e2f7d4b94721f90ea207cac7b7102fe943be6c66bd85862320c8749d9d319c4c7e077d2a5a31866e49bb81b7ec3a1a57e2d9a91efea6b22a7207ddccdaab3f3fa83d6eda3d7cc7897e56147d90cf4e1d70a9697552119", - "9b0098716589d553634f4f21e334c3aed98f173334c94d99bf731588a897e0dc2e3b7bdd9efc01f9c724ab8d192e2c0b1360a29d087c97883e69976812dfa5d4d5892f69010e3986fdbeddb157e523c9dff3e36f94b769783aa041159ab0010cae8e45de968815a07911ac36de5bebbdfb3429a043128fbe766ae621699dea970adf2881d714569ae00a4fe71c71b513", + "0aef42fed4a4c2aac650065575458a38f884f7203b57e178c31aafd105a7367ffa2aac730e7563d862da2a749280fb0ff1a37400917e5b0856465cc5e6926733123f2cace3422a831a97ec670810f9197e55e139dc78353907d0cfe4d4824b09", + "81c5a2fc2944fd5c7ec72a46b042d91bb45066a7a05f32efe51131c0112223e2a5c3a96ee5a8599888c810c02c886c001aae129cb3169db130a1c1864e923543101d62fa6933bc5e54f6292642d043e1929ff4302b169e6f15fe311d603cb805", + "6fa0227ecedc07a9d3f28960fd541c8103e7dd21cb4c8849f4924b0f19a43a5a782265bc6c9244a2fb8b23bec0c90a0f32113894d8da9be312ad6dcdafb5792095b8a211ccdf6a6883cd0d5dae5310c31137b7839b46fa6e27a7e1a0933ed60b", return_code::success }, { - "8073cac5550abbe34caeed219fd7ad8a74cc93b89aa6a15cbe85d1bc802be24ec78009bfc80590071f62c736d42ae60ae4e59f83fade5bde522d02b5e9a3e3ba5a84f9d5112ad71db2e86a13485755ccda668c77c32bd21cc06f0268b0a2f718579c94e116c957ee7b67fac427c1d56cfdbaede897b4d430e7180d09a642788863b0dd4606ba32744494bc71f1ab6e07", - "a4e870fc30c54c92d347942768133f34b30b8776b55898ae3f1938c0fdf2697bc0cad4c26a9f2c9c7b8c1639c72a7b185db7b401867267b05c03f819fac65683664d9b3efff1b0101c799347f75b3df020f4ec23c2665a1cd1376422d1f63f044f95e3f20bda4dd0c3a541283d8df7e9e8cc1175fcf91dc2d9fba8de51710bab85c724be4aca0ca375f9eb68ace8c413", - "eca31649699faa52c0acb904f6b5ba7cdc9ea70c40b01e6169863bd74dee12eeb9f02929a4176c562c94dc9b1c68c70f67be02ec35a47c056ebb06f931cd3646dfb5e1e1d52843d7f23b62d84265e065f5ece47d182dda4b24aac8272773e906524060d7caf793152cd4c1799f638c5f7bfacbf8ccbc55b99b7c4c15b16089390ff550495c0b3d3de684ffcbd3c1bb08", + "e4569c409a806b2756996f0fffbb1b02a5b3cfe9878137d8f2cc59c6fda0d18ece50880b898066d355d105ff0d2ab507d0ed061c2c52e469a97287e76e5838b3bec7ee4cbbf4d5b87bbb64fc37258e0e7840709fe7a38b778fdb096e1e8c1016", + "9480a24ea403efdfccdfbfbe1013cb4bd27dc0311d9f82b84915082c6daebc2e27366af4a8b401e55f90c95d5220710449efeca8b7275edbd62b0e8de5e298e0517ec40a4f89eec30a09bce22431734f1eab6d7d76a6528f01a538a3a64fcf04", + "2a9771a9656898d9862ea434b6cc6d1fb52bf6a6a7999389784f9186f9dd00177ad8998c429981055f5f4043de2d2402e3c182f21e3fb672e98a0636b8874d1cb127bd3f6f1cd99f29e8786ad113c48317de7d70e93c41dccbbc7dbc3bf86319", return_code::success }, }; @@ -117,34 +117,34 @@ BOOST_AUTO_TEST_CASE( bls_testg2add ) { try { const std::vector tests = { { // g2::zero() - "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", return_code::success }, { // g2::one() - "b8bd21c1c85680d4efbb05a82603ac0b77d1e37a640b51b4023b40fad47ae4c65110c52d27050826910a8ff0b2a24a027e2b045d057dace5575d941312f14c3349507fdcbb61dab51ab62099d0d06b59654f2788a0d3ac7d609f7152602be0130128b808865493e189a2ac3bccc93a922cd16051699a426da7d3bd8caa9bfdad1a352edac6cdc98c116e7d7227d5e50cbe795ff05f07a9aaa11dec5c270d373fab992e57ab927426af63a7857e283ecb998bc22bb0d2ac32cc34a72ea0c40606010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "b8bd21c1c85680d4efbb05a82603ac0b77d1e37a640b51b4023b40fad47ae4c65110c52d27050826910a8ff0b2a24a027e2b045d057dace5575d941312f14c3349507fdcbb61dab51ab62099d0d06b59654f2788a0d3ac7d609f7152602be0130128b808865493e189a2ac3bccc93a922cd16051699a426da7d3bd8caa9bfdad1a352edac6cdc98c116e7d7227d5e50cbe795ff05f07a9aaa11dec5c270d373fab992e57ab927426af63a7857e283ecb998bc22bb0d2ac32cc34a72ea0c40606010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "37ec381f5f912b9237c11a5bdf03d40e1abd8f20bc48aac510e13fe27af89e486f39cdad8832a008895f2465dd527d17d86142dcc3d150b757bcfee5f1268e4a30244fbb153fe246df4d0d9f165f2c9002fe6398f79481d55395689e8b15f80c5fc6a7c204882a60d0690ac3920c7303d1334c4366479b2c0b08d985db9c5948d4d2f94aecd9d25fa5e8065821e95a068bb9be510e5f40a65b956239971c361c27c0bb669e418431e39a56041ae44d30aae0c0bdc702bd1c3a4b6d8a2d349c0e025070110ca926c3134559779893752459a2c1a2d23485da4ea77b195537fb5b356a5cb48d9b931923dcfae44eaacb197cf3bee0bf0e5255433bd8b94e1a6e7e56335dae5625e94c5ec74e0bfd507c963317855760a5596598694e5d40890d0c", + "b8bd21c1c85680d4efbb05a82603ac0b77d1e37a640b51b4023b40fad47ae4c65110c52d27050826910a8ff0b2a24a027e2b045d057dace5575d941312f14c3349507fdcbb61dab51ab62099d0d06b59654f2788a0d3ac7d609f7152602be0130128b808865493e189a2ac3bccc93a922cd16051699a426da7d3bd8caa9bfdad1a352edac6cdc98c116e7d7227d5e50cbe795ff05f07a9aaa11dec5c270d373fab992e57ab927426af63a7857e283ecb998bc22bb0d2ac32cc34a72ea0c40606", + "b8bd21c1c85680d4efbb05a82603ac0b77d1e37a640b51b4023b40fad47ae4c65110c52d27050826910a8ff0b2a24a027e2b045d057dace5575d941312f14c3349507fdcbb61dab51ab62099d0d06b59654f2788a0d3ac7d609f7152602be0130128b808865493e189a2ac3bccc93a922cd16051699a426da7d3bd8caa9bfdad1a352edac6cdc98c116e7d7227d5e50cbe795ff05f07a9aaa11dec5c270d373fab992e57ab927426af63a7857e283ecb998bc22bb0d2ac32cc34a72ea0c40606", + "53a027b8caaa52c9781b61f30b4bf181aedb004d1e1eeae10e5e82b895b9c03b86d57ecc170f37d2a940d557395338167735c3478c2878612ac77eb5f686c8c672151e03d11481727410ba04a96206d74f120a73470e529f727fedc1f9de4e0a99984c1ed7959d99bdf34b76e9ec8de88aaa471e22bde6bf9c0091bf69da669a7856522bca8deb0a63b0820d44fb6804f3cc366e8bfddeac67899ca5a01a2e42f508c3137a3f009716416cc6d95332a43671883f5461b33826dd65fa52456d0f", return_code::success }, { - "9fedb6819825accb2b8e5264f7751adbef3bcba87758591c12a886c03cbd6fe826c05400f81e9c19d7a2f59da2b9010e3907c8e6b13c6dfe3846af5794238ad10f6c91395b0831b6b7c5df1629248ea416fc71e170d071add93ce645226c4217d42cb9ffdd6f6aa7898401515cbd7a6e5369a0c1ca77e5bc0d92cbee10d79fc03ca30f5b7dac0c60d759a7b52c05440ab9e893411f57010fdb13b465ff73f9faa5b62d618a380772561307b43cfc1f50bc85ecf5b0efd166f6e4e07f699c7009aa69fd1bb6801e87dbe81f05f1c12622972911c675b613062bdf746f2e1b1c7365428fb9729ddaed8cbfd2661476a604cba42b1502f111b51b28aded1167a3c787f490a3fed639bdf6c3fdc25cb1b1d115b8b9c9fadfd50ea69b756834c09512", - "d12fc1796c68ef3e363cf5f54364fb7178128678a1c656df751ac4ad739bfa3561bf8b156e2da0205db3196707d41d0126462a781f7dd6e6702a0db7c8429c149f0e59d70b303faba5bd25e2e6ef4162983f9ac0ee7d47463afcceceefe4fc0a7d8ecb6d009aecca3385b94f4ce81d36e3f4c69fa25b61df1ade3d49f3e7bd84058c51ec6c5f64b17f0d05db1af00d035f459a2c03bf6ac36a04dc80a3104ad5bca50b2920ddb16b96edc8513e1bb3c8bcd09cb2f9ae714579a14ca4ae4560089715b8b2a2f4283b0b9c0a3c686461d272e8b04ef21cd14766b9fbd6dfd61f59554c06ae52324d38f35b6e105dc94d0956a599c460bbc5ecf4c109a3e486e91ee553229818def0797e7b01f1ac861ce31b252cf4138b1195c0464fdefb286608", - "034695efb9c8cafe81689d14ecc8e65623ea5020a07233ef095f84c07a42b8342661f9c872d98cdf41c75b08320aa41977198b14076b663a62a89f041afc1bffb5d2276060858cd2bcd8e004d33d935ea0fc4f823636c01da91a166e11126213f5dfbe35591acaabab64bb66124d28326a244b353730ce6ac05d940638ba14863e6e4c30b6d7eca128a53bcb5c648d173de15832746a29e4f0e4ad34b881bb08e0f9d2990bbc72c9bc6df1228e6e741ee1c59b2b7333594f0288806254b8c10c0352c80b6801b410ff9081a7041f4687e566ea7c4b29b9ffcf6dbd7a2c1fa7eaa65d912d84bd0b07453c5e1d8cdecf0afca9e3aec688e47dbbe43ea813476066181563481aa38cf25caa279f9700d7f79178f01c3e07cda32ffc4e01ea7c5803", + "a75a447bc0dd806bcdaee2cb429498193e409a4d370dfe0e9605c5a9ec4a09c0314c0321f2f918b72e5f37cf10ea7e0b69ac1a7fb3200e63e5cef9929cd2d9afde2fb957989e610c5b44649af8649d968baa0424b873b501be32c66ef040240b469127753f17ca28a072c2151b69d51fecff1ed0f4786b4e6fd4e52ec72f95ef73cf19fc2d6a28267bdf11a262b403110c2e901fb32d0e900082e4934a20c1c06c262533488fd7f9f47e4e2fde102fe98fb48344de25712d5e2e2887bc04d207", + "11cc3115ad08c43ed0b7fc3945ca83c69d0a6663f05b25373ea3fdff14c722a7fddd7a1b4f1cf44290e1c480f50b6208419f6a208ea48a48cef5a345a35c052cf0db4a76c719eb90a5829a8f606e99c807a6ae71493f079c364d57f02cba7c124f344978bb539bea7c448eb96ccea9b6c7b7d2495212b88227fc269ac88391f4a6d23e2d47d4fe47e63f8e709b61450644ba13c08e29770bc397da41466cb26c9fa7a1ffd9b5dd5c51c3ddbfb88412998e41f72e63b7972dfd856b9f11530c01", + "d9458632a7cfcf59e72cf6d1ad70ec8d65d9e81edd0da77c2b10ec4d2a4169f1b0ac46419796d3ed6ef66b34eb76651288d916a5e5b44e75cc849ecd257a223398f92683f2318bf5fe7aa2b5d45e97dad6c415dac4b9cdc1c72071a4c9845c15096b203deb2e071d3856983cb26a101eb193cbfe914000ade94a62339b2e418c4a53578fb177af1986cc9dee3ce9ff0f9598925cb7e5a29af31404fa8cd9c22e17eb1a44b6b461dd9b7dc4d384ad60b82d94e431a389a244b1724a5441ac6009", return_code::success }, { - "7292b7047be950cb98766c6726dfe97f0cfd616dba460520db5baa542049dd0e864fcbb6c6c9081dd6d14fd80b71b91408e5b018076af52d9f581e3313a8314d3e28344dfe259924c999982ea7c5c99ae48a70123bc2aeccffb513124e86010309774bc4d5679f59114f2a8531ff0006315e4ff68429968647a22d40f6ee4711001324e966430a64a435691f69debc0e598d7a5ca0030bee06b92dac3f11bd0ba911fb660f065c53dabb529f879105face9cedab83c3707f0426c6bdc795d20e5529dba50a5831120ea15a003206cc09afea4407e76bc6e52b99585dfa2a420df52ca24ff34024bced3f0d0a6a16be17365152232b159c9cc7f8e84572780dfcce90fadfcba26337832b9c9da40872feddbde8d34af44eb64fce79f0c93c4e18", - "6f389fffc75894538a6a529598c055b75b175ad4a987b7d2fd3559a96428edc1928e385175d31d0bdeadef15d6a86a0c2582893e61087ecf6bf2d93203d84b827da17ec5e415c20f81ada4835f50a12a28ee66173c06daac6c84ab052b725f192edd1105a5ed8761562492b04f1b73fa6ffcdb90c0545b93b3fc53575c9f523339828a2f155b1db7351d3f8665d83117450ee4c958940a8b7b916a98238d11e0d9281e8b7b48f1de3ad708de80dddeab0b164b1b932db9faa547ea600e9df105ab7611d2831139810ee3f7e2ee267978fd4c9fd8798b4384b49dd2b83e32607814b558697368ee4b133898dc0465f304b34e064ebd8d1dbc068d353a133bdaa583d494a1c7a0c2286e2c7aeaf4f1017ad93342b3e1c1dc9039b29ae3bec2e210", - "01b6280399256c33068a03316de8793f0b3b7b821440d0eae89698f1bf3ac6339b1bc4d926ec46b3e69e2dbb01ab41155cf70c836d595e3a1f316cc4bda8964c6a1918fb53d8f3086c0d7a557b3ccbe6cfdbdf240646b8b0ebf9e5cd284f4d00c31f1beedc5441afcbe931f7b588bff2d47383c4459aa05f2e0a1f47a128ab8fa21ade44d77d69448241c35cec0b09030b9c999b9c3ee3b12760c4191b533ed002b131d64774562a61dcdd942d6d192790fa3c9ab9c2799a706bc4b8e4489c0f0792f6014ecc421bff98c14510ecd254b1366c899f38b9fe5fe272645cd8afa820540bcd96825218b5f605f0cea2e40f81d6f59144bd82e2bfef4f9439d2dc8c283bc5e49688e62d0d27470c92584572bb676ce1973e870c4a2d528267730f16", + "21a061f3593c8ed7a9b5e6f4c251bc48a20c7aacd0bd815108463f0a93c09a87c0eebfc1cc10e0b660baf855a3eb2803f0509a61c459389d5c298b4b444ea5330bf3d9e5149bc36a39bc058fa5b1e334372bc04faf088285267fc539e3b5c402bf80f038cc61d6828907276dbcd83ef8259e4d0d574ffaa59791454e4ad96449973b6c69a21cf8e0e615f7071e081213fc06c24053503baa50244faaa25fff561097667d75620539398e8d4cb394bae1b053526f5128c92615e554ed04047b0d", + "1a1185c9b721b3ae9960f12be618bfc3affe0421ea220baab68924acc836704d221e36ab6a5b64d6ba40b549b90ff406d6e5a12ae715d4866759546c02d01f0b62580f5ca883a7e0ec8d8990f0a0e05c8db323a70be785dfb5fd8a34f40826117ff499ef7f3a8eee70ede67813f4464228bfcaf6293984ef627d13d48c30676a402fbf9758592093241e8824b5f062162e93ba61d98c99270abf2545ee00dc69e88c0dcde99b9cd167a3550f05d42ac61d472cf33e890d812b59d2858b6d2113", + "15baed9fe2557619878ed9948544f92cbe15f4d3f337e9e360fc568cef53e4494e9c00e3d7618e79e34224b9aba36d0d03dbc351031e98fcc2167f228fe6759c48f434af22a0bffc027d4a6039a3d509ce9617b993ab3ea0bb71ee22623a4a083847dc6ba8494551aa67cf4cfe18cc85ba6ce94ae9812eb53a74dcd1714c5b76808f6800ea451dea77bac81deb84a002ea45661acd250ae001a31305c33ab5e965cc41d2a52a78e86b2ef75789585bc7e5fb3cca22427c1e3ef32bcb21733c17", return_code::success }, { - "7998f27e2ae8577e9f03dfbf5979edc189e4499df4046b256ce4dab0ed9b71e6617e894fb40d0ac15d166f2e28a75e11fad87fe49585b3ebd75e2efeae7b9987595308fd4238d917d3281ca751b2efbfccbb0c261f28e3696815270fc6f6b00addf860b1a7e863edb17e45991cbb25665a22e9a40e3fcd58aa875b1fccd4d2db3c446dd731ceac57e7bd0f74d2c40b091127ccdd7bebf2f5048d193b451d8a145896bf48b4c053ff99ff1e69d47dcd7b0d98e9d40e89b00cbbf99377d63e5e1887c76b8d82e7843e25bb6bbd16eabc1c17ba0c0adfe0599f8aac7519e2b78df1085eaa33c088b4318e84d49f5fe9f50cee60174fe4ef7cdd24658f84ce3ad6d08e65050d28df66fca6139c8fab230147af1820d50fdb1804dd6f01290a395811", - "91462e5b83b18c62a78492b10e4c4240118400398c85a07fe7c1ffc4d78cf3a6dffe717a4c05331cee49273a1350a71714f0dc231a91d3d687e65416ef070932285facf8a13c26d9311cac3a494179facf6b623951ee749da29b32cd39ad4500d94ad0c0b4bdc8346c4ea9ae497b09b31e356f75368249bac0c49e6dbd20eaaedec624ad8971691382e44fb00bfbab00eff738c3e8ccf3b0c3295d49adec69a1821a38c7ad8b06ca87c66ecd63fb352f1b254bb1dfcefb46a56a3ebfbb745a08fae66f083c8cc37d379cf8022ea3c87a6aeb747d38f7405e04be72fbec8c99e5475321ef4adf3219caddfd4d2558b013eb05f346b180876b4886bafb43d29b0d4cf99fa76e49184818fd26570f5bf98c53f9266ba24803822e6abb3996690402", - "271c51bbab23e74a87512782b502e2045745719850222b88b3e74c2827d7e157178b8221f95e81e0b33c37eae451720b2602fb54f74fd0e9616c23ed01b700cb1635eec16182d83fde3063c505d1165a2e9324eb83a6f664cd75b5aca1bc9a0d6d2f0c65e6747b83e98a781fe4172e73d65ff02f76ccf6d3a3a888fb7a745bf036be4124d4d4788829ea96d4131bd70114eeca364293d4242d9194e71a6d3d51e3ff533df81f92bf1ff1961f0ece0243c1daed01e9a7effbd08c7abea2629b13b0de9223b4b163eefff5442d37175e05d4d0116a497e4cedc01adde05399a875bb194606bbe8ca6eb191a456941bd51353f9cc531690aeb77be5a6b251cda55bbea3adf833ef4d5290226f82a8e7c272730aeeac68ad55f0001d2123848b910d", + "cfb89cdb92a23df51ab91c1cc3579a1adaa518e8509d542321ede6ba0bd85bf6d6c6906d87284cda86433e47220c87117c9f113cb8b52420230fcc7a49b407ccccc666806c40037d931479ddb9e0d1d52fc069d44f4fb92dfc9d5bd5a1390518bb29ad17c7232c4937f27125e31da044b35a0516624f9ea5c756d447202439d69489605025e6aa33ec789adc3b611100205fa8163bcf7050e92362613fd6f5fa55e03aabf49fb6e57b27b2b1fa1703a189d5c643fe2355b19226c0562d643e0e", + "9158359e8b6fc258137f6bd55f89d7c358e7b356f624b9f2571d843cf859f38e60cf50d8f3c4e3e4f787a028ea983d198aa5a6e0756692b7b07ce2cab3cb197a04bdea66a429fe328f18c081f8daac5458ae88c92464225cc3a760ed3f209506e5868b9d083c653d136c2b3ad81764ca721b31582d5accac8793c74f46551b07ba54e8d415fa6569d5b0a985f6bdc40d225dcfa2490201041a2eb04955109258a8fb538c47f16e4b5f07fe6c7b3aa3ad285b0bd4ed42863abb37c94844894b10", + "156337c65f642da937b7792093b419e1bb06bccc9c9f77f8e1809f573e6df6718751bc831b6b53cf4813a3e066f54f188c01ca463034a0a6fb2ba18bd5b951e1c4d4875dd1dbb36fcfb2837bc8f0f441b287505421f0a715e786ebf24a62af0fddff6849aab4f3895a183b4574dd636c4a765fa83d4b17b30ea43607631961964c645a49720166bbc1ff5ad6944f20026d3e7c5358175a8892623c5ddec28c12962033673a1c1b68d951fc57a07594a6ae1ce27cdeae3e86266254516301de13", return_code::success }, }; @@ -186,73 +186,73 @@ BOOST_AUTO_TEST_CASE( bls_testg1weightedsum ) { try { using test_add = std::tuple; const std::vector tests = { { - "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "0000000000000000000000000000000000000000000000000000000000000000", 1, - "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", return_code::success }, { - "bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f117e1e7c5462923aa0ce48a88a244c73cd0edb3042ccb18db00f60ad0d595e0f5fce48a1d74ed309ea0f1a0aae381f4b308010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f117e1e7c5462923aa0ce48a88a244c73cd0edb3042ccb18db00f60ad0d595e0f5fce48a1d74ed309ea0f1a0aae381f4b308", "0000000000000000000000000000000000000000000000000000000000000000", 1, - "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", return_code::success }, { - "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "0100000000000000000000000000000000000000000000000000000000000000", 1, - "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", return_code::success }, { - "bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f117e1e7c5462923aa0ce48a88a244c73cd0edb3042ccb18db00f60ad0d595e0f5fce48a1d74ed309ea0f1a0aae381f4b308010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f117e1e7c5462923aa0ce48a88a244c73cd0edb3042ccb18db00f60ad0d595e0f5fce48a1d74ed309ea0f1a0aae381f4b308", "0100000000000000000000000000000000000000000000000000000000000000", 1, - "bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f117e1e7c5462923aa0ce48a88a244c73cd0edb3042ccb18db00f60ad0d595e0f5fce48a1d74ed309ea0f1a0aae381f4b308010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f117e1e7c5462923aa0ce48a88a244c73cd0edb3042ccb18db00f60ad0d595e0f5fce48a1d74ed309ea0f1a0aae381f4b308", return_code::success }, { - "56fb700d759b661cffa9e350aec51d590585e0ceaa8c1a6307bb3f4b5f9f6c99876bc0438c0855b9b6556acae04c0900b7a7690c60bfabc1fa082f5bb22bda7388bd3a14b55ff2c76587dc853a14585aa5216fdbe248b70b9219e3006ffc5a1561c571dfe71a8e423551253bad43d887b5bf3a93956c6ef1bdeebea6bdde14b947c402383784c57178fc83d9f2dc240e", - "bfe41699bd50b1461f6adef26ec1ac3116abd97b42b9bf0d44aacae55ebbb771", + "9a2b8be9aa85b21fc3e57d951f82c725468b3d4896f559270f836a4ae233d0d61e31201df60459b4a8d7e64333fe00163c4c764f7fdbe3e03443155d8ebf4115bd46bfeb0385cd5e6834ee267b578a6064c82a061444d4c93a5af5064186f816", + "94772651ebddc40c83063785c6051b1a04db86716740f608a19e9ac083dfdf34", 1, - "51e0871837ce0f9c72f1f0af031c7b9624ab8b6517fb012829c99fa0ed145bdcb01fa238d63811f0648eed778cb2cf174e439855eb15ac53e6b1c4064f34c4e538e5a066e6da61edbb44915af9294b51ec8bb286403b027158fe8b6603edce0e7dc24dc0912e3af82f1c9167827678ed5ec4180293b9edef01d8b9d6f64ef1a2a4afc9173f3767f5c71f109dba234602", + "213f55cf8287927bb4d6859b8e3785728975b4c6c2b1b85786ad8326dcaf1c7124522571feea1cc12e54c18fe9680d0628e254af0a07e90f0d5e8294032c7db51df0fdebbb9b970246e8d8fb2b6b5481b7238ca95880c1acfc6f96b47e148707", return_code::success }, { - "56bcd8ea8d9addbe64cc09200e5d562a892a772c019cab467f0ef941a279ba13be847f1284190419ef4dd0ccb7846b15cdbdc2302cc83fa9bd13e782850b4273b3c077d2daf86e385691d96b878343862bba44d61406f2be3516077bd344930b18f61d751a8745ed6dbef9f964430b35d4c984d77d136d84c5406a9970a92d70629116af1305f983cdedfd13931d1c0e", - "3a8e9a6c80c65b79ea9b84344e8e4f3bd709224c3eb2d528313cdd73427d5a37", + "079a4445f4e88d61f591dd1d1f9d6745eb12573b423d38e0ec71ed3c99c82ea3ded755ddd27715201209a9c51fdbd21479f4b92a76f8e840eb7b962e17a9d0b142ebaa7d3fca74a6adbd4fcd38cfb7dc117eb17a5e9bebc2b68adc2376297a0a", + "f69ed20461fa76cfccb98fb2d1220311cc289ef6db6c902ea930fa3ef5992c04", 1, - "9e0fbffaa16ab6c0f8dff313e8762cfb969da49064c9e5e1fed51138d6ac994d9e925d34d85f43819a9542a614724d104c7063e4e4d964c7c45ee327499b0f16ccfb851fbddd6e1ac3149881e526ba592528dabb7608be4c4c2fb0807344130824d348b88b72e4e5032eee3e20bf07096a414e19f701a8aa0744d005a8fc686ccae172ed6c09842c49f37c3f5e9bdb17", + "7ef366ab891b0538c30715606e1cda283ff62838f633255abacd0b7d1f4e97d0c580298f390ab147b4c2e3395c6cb107cc63ef2c65383b5898210fde2a300d6838c849f9c18efc3a7bf5d2f1987bb68497f722cffd896e548a26cf69511f6e0b", return_code::success }, { - "a6ab6ade9e58a67857fcf69bcff210e9b40369144f7dcaf00dc46c43f7ab7e0f233d8469279daf1a97b20e5b817d6108a9cd276fa9e6bf6d2112066a91658de928a971396835782096e9c1cd75c3c0a2a917e433f2ea36a5a1edd5a22c0d390b635fab99620b983e87340a8238307608a7c5221d6760ac3122c4b1710555b3d5eb4b15b1a43e238b8e85e9e885c6ae13", - "4efd4bec47d91858f9328b5000e5d4028011a5b9f94ed8106541878bf1976245", + "663560433bf70503eed31386bc989364d9a75b4853b13c039c5e06b3edb4c80fa23b79484955733427cdf158ea364c0e50bf708a7d05fad908c44983dcda3154378d203e016853eb9edee9f780ca9e87e8a1ab67a696101611075961d02a7f01", + "b9287625a97d175735428a6ab5588425601dc2b8a4bcd71e67f41caba0c6be1e", 1, - "7671e871c42d00b72a9a2cd3cd518c9e9c7d75ed889787287ce5e3e2b4716474e9975de5f0431aa06aac2168fa9e38114b8cdad6cef8e88a319bd0a982896e392737775b5114250e4fabf180351433a75bc33497f514be84e437f38bcef4b6164e1bbf94a16397a17ce96861bccdcc5b538fec20b53fbe35c6f48853d3ea10e22c656c53c4e15a0ac638f74f59f50b0f", + "8490a58c9a4c5ac0228c7df29ab1a5c77e27853ee226dec3d8aec1dc8d51f4fc0cd0071b6bfb43cabd76ff52e6734c195edb5b2c80e8835fc03ec20a428154410f92f3075546af65c012417d114733ab3e3db45d23e7281b4f3117e44663f417", return_code::success }, { - "dcb618d46f80506aa4c8b76ccf68a02e3ee3d026e49f6af27c137e642a913c194348fd4b3b5e820de212e18adfa0d20df96e68b55c29b475b723b1312f63b8aa0aee12b43401daae8feb9cf4004c8ffe373804b38f62f874d5ce4cdcef27fd0ed652d3e187165f3ed4a440f9c51b336b5968a7e91d16cd01bd360c318c1d54bf67d1221b2ab135f809df3a7778eb0011ab2c896d7cfb17c5db7095355e4540a422c298db6ce1dd85f2f3482408747148bae2dbadb5c92421473c7700e3b34b05e32d691d3c66c243926ec8b73c62af21678fa25eb724e50b5e5056215c0db74ee65bdcefef95b79d55419d1ac65ca704062464c6bb4e8ab5b386f4c7878d2c28b382b6a16eeb2a4efa9a69c70b652e6912f9524e679291c82c5f17f511551416ced99e93d6990082ada3f6857430bf36ec3ff672a21352d6d45072298097ec67b67ffecd48bed86cb800d6aea9d83e049cc3a6b09624f22cc5e2d130214e6a6ab846de8f5cece965415a41a955a1b4c694dad48571812e9dc099b5157298d9139dc267eac3e1d1390c6630dc870b6e684a2fa76469a8f5ec129552386f4a1cba1bbbdcbb82ae516f77bb2f78b82463182accfb2d4b291a4aab60e58d88d3dc7adc575564bcb5de03bf475b37701b27c55b6dd829409564b521680fbee3edf41102e2d16d423925870e3a348de97a998ecc393a25db64a89651a2b86d61a09498b1433a5fd7d267b55a43f77c3030760803ee7f6fe2de530e982ca0d4a1d929ebc21fee5d72a8e77d428c01dbaf611acc3f5baf3478bd458c78e167a5a2ac6a18", - "eb4838b85a7fb1915604457d07dca331d081c4e960e15b1c9e264c26370dd22ffafdef177ccb0521114742e579df2b392d26259622de6f13f8f4b8ea8d608305dee0d12642aea8997d76df5bd95872412cac12e313357c07c4f0c561526b525eef1980734b6a920f312042b58a84de104d1543c1f03c36266b389a58ea969116", + "7a63674c35f9f2be4f0ec092110b82fad24a283316a846d960843b9a6a8a98bfdabd7e897b7da774fbbb05d7ad95fb18940a5f7a7345e1821e0203e156d677e88445385bc0779d25f51b772be3c3a6ba0b09b2533a8ee66053b2f3c853994112e74a97324685e515c86d44ff5a3ef5218e53c6f29e7df49a546c79cd1fb9d14e63f68aaf6b2df1f6f56e6250fdd6f20dcc36499a5aea69f4c77a18774eccf8460e77ab6b0236ce2d85083faeacf0f3378a3dcc95e1d3b0ae282b9bbec1ecee1793e63ca4730ec63df496546c07094e848625610a514d99dd0a6dd9f58d15c4e4ed5aca65025562177ebd0a4c2c3ae8139d24be936dd5dbec6a54897ba2a98a68a9c43ea3199695896789c958bc289a7275550b5670a351b262c10166a48baa161f841df4255408abb7186f78647422313fbe3a0a35699a487dd71482b76b8adc20622f44bb32e04a78b98e4f2cd42f16a6d35ec2463a484906dbb655969b900a15cc8a47694b1961bd4b2e9f074afd79e4c04344d31dd8fcd56d5147a9a47712", + "2be3984dc7a5c9e6172df42c905be929ce5bb29d9aa31a03f3ed8816e7d1265a0669a674fef9254f0efffd3e89c30f1f05587472251d362e1acea03a76918d137b322778b8188c1bf68c36ef8e0ce933290c67f981611c13a286e42235f89855e49966a4e9ad8c64122f4f5e720986193e59771fa91aef113d8739642bdd6613", 4, - "ffc9085ff3eeae99e94cc295baf1015167b938947e030accbb0530cd83d968e04a7331ee358550385be31015c44ae40236aad3e318831af99df4df46aeda1234ee334b10a4132e1edb4d4405e943ad051a67677af79b6c4152d3189c68a6880639ee15e8dcb151b479dccf7d5fe20f697195f7d724ccebfd8d95105bc047b5fa8a65c816946634d2472d745ac2cec902", + "25038aea2d2d1c15dad2fa4c6e31162d1b79ca1b1bca608190a05dea451701e9fc95a8c441a25083df7fa56d54eae51241a8c9489719b9cc35852ce3d7e04b5ada5c65f45d1818f80ea161264b70ab6fa86e694691281b8110000d209aea5c17", return_code::success }, { - "4d06a8c835228a3176bc957ed6b5133efc08335cb45cb6e6ca10f62465718c85ce90002880588bd97914b6900cb62f07897722ec89f1ed966150c6be9791d2d45668c0fca36d3ec396c0b2d13287e9757a0e32bc70ed761ea9d4f3acf8769f126c91af6d593bfa8d04b2932a119d247277d4b2525ba94375f066f523c907fc016d555cbe4012477016bc4d434144411686e3596064845305fd8528d5d3717eca505b970bf933d3940d6a29a8afd35d257b014a15aed0b63de3450035f548ab04ec8394201ff8d4bd92d73c9f4d548dbbf9998b153453410e8214032a4f47282a511b99a6435c8a658987be5c84c35603381c5e2827425173da2b54ec8a1efc171a65adb910217e61731722a79b40acde67c1425d5dafa2edee49522afb26c40200d18e138a6da3388bddd5463d2521eeb2c9eaeebb6fc0c63affc2b1b7cc678d7eee2891b74fe7ad3e620a24f5bbc215ae1b2584bcc71946e4bcc00e8a91508f331d15b19c9f50561e077606e8c56706f6bb98eabc2a63c96293a83472b3b005690965bcda3acd44f82b654d5caca9c521f93113badbafe5fb50f51ddddd40f1c262862192c5d147ebc2b82b771e4d179e46a84a1d31e9f219c877f6dd77b3a784f7df5463d042304d6e889d8acd8003fc9e89ac96b48f561bd15eca654eb111a94ec406881b6fa331fe61cfbec2fb2322bcb8ac7c5ac7136ac1a811363faa6a37a16aa2a6728e4094ee6d2a395fd509663b700cbef78b70c37ed463aaccad738755334bd631889a04310d666cb3f7db670e3142457c952183501cc7a8f32419", - "eab5f9ee6fb7201cfad81ab70971aa2aa4f0adcbc23a21215a7fed3dc19474704157455231dd4772a632c259c79fa22ecb94480689b5f6251a6b4fb69d29b12cc6bd2ba85ba90c945af4679cf4989b30fd0b89335c68971d86390c2af5935726e79f59dad66f0d2c0262469c26c1bc02e5c4c9a41afdde3274f96637523db65d", + "72a2fe9201ac05c9cfd84d73f9045aec6f22300453e659909d4490f59d598a0bd29d220246a97de00f87c34f05628803383cd31591c16396db11fc9b1f814fefce8427e85789919cfd27654be1c6801feb0b9c9e6550d516fd6e9622764a240ccf149d86a1be65215b8b1a5fd165841fa1cb34c0e5b2781bda44125d1d2890818ce6454f5108beaf395b138a7dd7ac0e41182171d01c3d8e234f5620415c3bc4a120ae317f514ad29f87a3a47e8b4649a0e39ffc25111f998ab8dcb9d149c50219f30b8ad6a3758bd2c60166d1adecb4ac4e2b7bd041a2583b035087b0fc5348096e333cc88668d690a4810c3692e212e8b83d3664fc6587d6794aef2e1cb2ee13cc38060999aa4f9dd40c1754ce98d2b4fd1d2970abfa88c0d416c4c3b2070ae2a9a928bb3be3854b702136c1b69c10dd4af529e8e2d1d97c00f0530eafbebb2de6ece8fad2c4c72d4db2bb0001ee087c30d7527955b23ecebb35106b2e169d25d6e1874db74a02f9729b8f1c7bccbd2d6784617b149ae2a452b77ae0707d15", + "d40ea97ac1a692e96eca089d05111707219729b00e9a2a02998c4f7b0c670d17d3508ec831bfb5f9af0fca2f5d22631333fbadaa002922059850bc641a2ff50eb65d787c1df7a1bef08b783af42a37034b2af4e0ba75f414b0c7a2df113b0a47d1a722acf33058e810b6cc81a59cac3033067cacb776041f157f3e578a241718", 4, - "8cb62ec44e75e49f6d5e2dc2bfc4bd5e472258cd157050d110b73d71880153f5aa56f82421575be902ea4c2f76b6d301a56384b237465fc44ac3a75e60448894bcc946c5700dfc516acf5472de583f2e662cf941f12f509895a762dc034f980d415b35f0fad0ddf3d1ccb98e887b1b3c1722e31fad62f53dbfc844899a7ae44369154b109ac03a258da7bd71773fce19", + "f2a68d18e246502e2f8183536f3a932f0f8475f82603159acaa54a958a2bb04c8e3a16c696d180a3309fb508fc659b05d6a167c5181a7dd85f80475f771569facd2f7b5741c0bb13b68574dead93767d67fdd9bba78165351fa1d608379a1801", return_code::success }, { - "20d1735dcc2d5d41c216c4454a1eb76f1356cdb8db2ee5d20cac5664b7193786b69afbefe9acb627a601ce4a41e0341642a975aedfd479e5fc395bfed5e6f59977ccb721fea6f27e41d494d8f6a570b3e771102f963282d53e4fe0077cefb505a6727dc3ab58f011eb3e28f8333d8f679e8f99077ca57d1f4eeb9655f91c8364d09c1cbf04bd38464c3101478a7b820015ff304b751a4928160dc69d3a54619c35206808e03fa205b83a29ff4dffbed65031fe49a9adda364c029c59c105a518517e780fc252a7e2b55930dccf9553d6952364cd93ee3de6efd2ae3a29bd4909d41b20e628706ec03fc014f2e14b670c0091140201f70bc8dc4282ab700bacd77a4303158a74583776d0ea6efb3fe60c7daa4b684ab0ddd88bcbdb3357a6db06d63612d32b131f84aaf04579342f70d8b469ea6a37b31ca859d8ce65ae3ff9f1220cd53e0dcf48e45155c47ff793080f87eba9dd36e82ceab065f5a80d68118c77493735dd1fa5e18bc046c692038509f4e05116e1e2627cc886e1296f81f8030eb2be70d61acf208fb9d294840cc31e7d44a4944e8dfa60a29ce0521f557f80018bf2adece6fb22d4ee5dbd39f9cc14ed384b5382c2e288b5454e16932b79eba69085bf978aa1e3c0a9a1fcf85643152910c5fc9bc8e79b89246563f19f2e1901aaa41b3d6b93a599ad88d7050ef7f6f01ff75fa94e46969e1175dcfec3e586a409b2230b4ea60cb1d512d98483c61984aec7c14117c471d62de392dc7ff6373cc01ad7a3542607889ad4a83a3cde18abca6fe37f228e52d61af48d0dc22510", - "ce6d7b7ed8e3ff3e93d51ea53e8ea94872c2a2f684175501566e651c2b037b0f49b2d0b4d2a5ce031fa917b393b64a2196fd6701d071662077d8bf8d0d5acc5f1c68c234ca67dd0ebd3777753c3cad1b7550b3d9b462630eb9b5e1f6061206466eba81651bf5959bacfd314f958b02430fda49d060dede0b1e328f916ebd0462", + "72dc1fb76885d993cb0bcf66538aa3b47f607e02bd7d569626cc400787ea1feb7b4b6e9651a263cf120b469d95b12618260335dfc6661f6000b22b3d80d9993226add9060f55f4584aac66541f2d2a7d9d75ffe16f4fab73354134712f90d00f4cbf334117969df79d5783bcce974b81aa61bb6e0093cee480dd66425e8543c106ab6f049f0a49807ea6a51f7850e40d56566492cb66dd99f1a3dcb4932a32720013864e4c8e1a8d6c46d9a8bbb9c2123e6a58bbbc0f4edd6e6e5f25feee4417b340dae988300a5169377a700ba91afeee4cfb762184335a963b69c430c08f985144a0ef76c516b11d58241b8d70210b7a753c067af7f40a1f4d7a19e1283837d0a1bb38b4facbf2e8eb25c3da1654590d5cfca695375d41f292dd83a55284063780992ae2a8abed14205664f0fe69491f41bdbd76322fe8f3f8f660dc53c7b34244cc3d40067b9560fc3d3ae8cb4408144b5ad3859f6f6b18139e6efba950d38beb2135419780add1207f37f529dd8980c60357c81e04bcc701f2ae0385f502", + "06f44a41cf494066febcb41b85afe01021202502a3129110fc116d3a978d662dd98e962ade1024c145473e545b117033bb7029d75263c60f367ef014693a6e30353e2ca706338280750107fd080c272e018af21d1d020f164e2160fde20a1540bff01005ac6c4af5b045cb88980ce049d39174ba095386312622d9b475ccdb35", 4, - "42068b82d2fad3172e12b1ab84d2453521a1fa1471ab898fa61805aa8e3df69606e0868af1ae00da3b4498c835857f10e1132fd7e787a67bc6487e4a96f1ab0d3b6a7211cd92e8c12dc0870cb07aa5a545369644bd27d0a934c3f68cd5b89014e2c7d32789b8618b7e8747fb2cb1534f16987395ed79f6c683365d9978338a0f7edff04133175859f1081d126a818a06", + "dd16d75b3de65d6cbf265575e33f4ecede22f03dfd72bd7c3e295b71fbc43ff2e6d9035fa5161450025074bbb498e309468e0c256ce5b44e441a7192b99bdff67c7c9bd7ba927629a68f93b3bc8d40cdada4480c0d4045d4b7e09bed42aa9807", return_code::success }, }; @@ -296,73 +296,73 @@ BOOST_AUTO_TEST_CASE( bls_testg2weightedsum ) { try { using test_add = std::tuple; const std::vector tests = { { - "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "0000000000000000000000000000000000000000000000000000000000000000", 1, - "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", return_code::success }, { - "b8bd21c1c85680d4efbb05a82603ac0b77d1e37a640b51b4023b40fad47ae4c65110c52d27050826910a8ff0b2a24a027e2b045d057dace5575d941312f14c3349507fdcbb61dab51ab62099d0d06b59654f2788a0d3ac7d609f7152602be0130128b808865493e189a2ac3bccc93a922cd16051699a426da7d3bd8caa9bfdad1a352edac6cdc98c116e7d7227d5e50cbe795ff05f07a9aaa11dec5c270d373fab992e57ab927426af63a7857e283ecb998bc22bb0d2ac32cc34a72ea0c40606010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "b8bd21c1c85680d4efbb05a82603ac0b77d1e37a640b51b4023b40fad47ae4c65110c52d27050826910a8ff0b2a24a027e2b045d057dace5575d941312f14c3349507fdcbb61dab51ab62099d0d06b59654f2788a0d3ac7d609f7152602be0130128b808865493e189a2ac3bccc93a922cd16051699a426da7d3bd8caa9bfdad1a352edac6cdc98c116e7d7227d5e50cbe795ff05f07a9aaa11dec5c270d373fab992e57ab927426af63a7857e283ecb998bc22bb0d2ac32cc34a72ea0c40606", "0000000000000000000000000000000000000000000000000000000000000000", 1, - "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", return_code::success }, { - "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "0100000000000000000000000000000000000000000000000000000000000000", 1, - "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", return_code::success }, { - "b8bd21c1c85680d4efbb05a82603ac0b77d1e37a640b51b4023b40fad47ae4c65110c52d27050826910a8ff0b2a24a027e2b045d057dace5575d941312f14c3349507fdcbb61dab51ab62099d0d06b59654f2788a0d3ac7d609f7152602be0130128b808865493e189a2ac3bccc93a922cd16051699a426da7d3bd8caa9bfdad1a352edac6cdc98c116e7d7227d5e50cbe795ff05f07a9aaa11dec5c270d373fab992e57ab927426af63a7857e283ecb998bc22bb0d2ac32cc34a72ea0c40606010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "b8bd21c1c85680d4efbb05a82603ac0b77d1e37a640b51b4023b40fad47ae4c65110c52d27050826910a8ff0b2a24a027e2b045d057dace5575d941312f14c3349507fdcbb61dab51ab62099d0d06b59654f2788a0d3ac7d609f7152602be0130128b808865493e189a2ac3bccc93a922cd16051699a426da7d3bd8caa9bfdad1a352edac6cdc98c116e7d7227d5e50cbe795ff05f07a9aaa11dec5c270d373fab992e57ab927426af63a7857e283ecb998bc22bb0d2ac32cc34a72ea0c40606", "0100000000000000000000000000000000000000000000000000000000000000", 1, - "b8bd21c1c85680d4efbb05a82603ac0b77d1e37a640b51b4023b40fad47ae4c65110c52d27050826910a8ff0b2a24a027e2b045d057dace5575d941312f14c3349507fdcbb61dab51ab62099d0d06b59654f2788a0d3ac7d609f7152602be0130128b808865493e189a2ac3bccc93a922cd16051699a426da7d3bd8caa9bfdad1a352edac6cdc98c116e7d7227d5e50cbe795ff05f07a9aaa11dec5c270d373fab992e57ab927426af63a7857e283ecb998bc22bb0d2ac32cc34a72ea0c40606010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "b8bd21c1c85680d4efbb05a82603ac0b77d1e37a640b51b4023b40fad47ae4c65110c52d27050826910a8ff0b2a24a027e2b045d057dace5575d941312f14c3349507fdcbb61dab51ab62099d0d06b59654f2788a0d3ac7d609f7152602be0130128b808865493e189a2ac3bccc93a922cd16051699a426da7d3bd8caa9bfdad1a352edac6cdc98c116e7d7227d5e50cbe795ff05f07a9aaa11dec5c270d373fab992e57ab927426af63a7857e283ecb998bc22bb0d2ac32cc34a72ea0c40606", return_code::success }, { - "5adac0df5e3a282dc813364ca18c028415b95dd9df9ac2f860d0fea01ce55f0a333269a9fc54a33f65b8f4eaf4141a16cc266f7338ce5173fdb1360694781d56125d1f68e343f59261d085de3b80e476d7e9270ad17890191f7d4f4160a49f03960b00664c707cfb02239df75d2c416b5c68b4d9774ddabb97dc0376a0b33d8a9a1cf9b96481cc88dab9ff9dff50920cf5d21c888bd669557ca8df124a946a30e29dca2225186ed7373672cae29b7902bec47f4672347c24c604bc033c92320bede4ffdacb11db324f51b6bdff7427e36914e9e80e5743a7f63cf9129b3eae2d645b04a3540621f44e987b6381e07f17bbf46da4c8a39a1c6b6759e713c5cbb0050fb1308559d1bec6b8f6a65a2315ed8b0bdf5c3e60ff4a0e63137494012809", - "3037b50b12f5c9442e9c7fe9c543f348f5f6eb2de2377a1618cd18d9885c386a", + "8d0b9de21f956cc86123edc8610324754dbef1a95b81f457185428a77d7a609926870d9bfc823e072e625d54ff321c110ee726c8af6c06224a87ee4a8a051e3cf1fc3dec26368929582998941a322e6bb06fd86b288c7b4f6836dd1f5a9d4b11c983773bf970bb5bde020860f4686bdab904becd067b48cf8cbbcd4b2931335215ebb1860aafbc43fd1677c7f727810678f000303226d1238666615c1cc89965d73173971882beff2b41a3ee632401b97b159d91be8da485c5f325496308f716", + "4c89b1c20cbb9dbc094eae3b5aea8c0725ebcd60af55421d9389197f2c30432b", 1, - "18e97db707a56e5c0a0c399adecbe8124772d84abca9d28bef8303883fb9223aaf92f68cf0bbe2ad73d18ad014971e12d515e87caf346d7aef3a34e7d0602785af3ca8a3d984564f88b84f35fbffd3543f9c9fbf04bfbc84b9f20addb09ff91873f3e30337e191d6d8c5c15431cdf7453cfd06231271c5adf597b8d73f4101d9ff5f5970f1d76bae4b15c9f9b8a7140f3d6716c173e08f6ccfc34c50698639887a1301cbe19c942a60b6ee163fb142bd4400820a4eb8b23c55942be7bfabce0778697e8aafe4d613d03075894a19b039593b4816c995e370e587ffb85959c3569939ab809af8a0fb12ddb9347a81da13c63880e64365d9702704c90cd2921eb30c3c470dc773ac32c0eab89208b9bf7567eb4c797ca128accfa01c5388dd0f03", + "7653c096a4ca440098f02b03b973a56dad8c33b2df9ce1676f79e07f858565415630326cd64b4b2702335aafeb37ca12fa8543a0db009a583e9122361ce052f7eaa4cf95671bc69265b3f2364952e0e8af89085d6bfb8751911643ff2b4b000959a5540acfc626325d9497bdc281436716fac51ed88537fde12554cf735d09dca909cf92751f0cbeb89c88fdd9660d0b42e6217cd362bb73d9837229b1a9489298bb912ee0055ed9463465b22c9949481cf27ffa1f4063097b4abfa63d2b0312", return_code::success }, { - "6d0daf59e2b7e50e4babe8e5e4690eba3d73423e99dd3ab129d32d7904af3911f605a002ba2f48f91932f2d2e04c6602920210df256b38e52d6503c8a4e5957d52d47b49c82b37513b2bdecb0c1351d3eede4bb50660b48307543d3bb2fd000f243510935fee0164dd30650e56bf3ac128f3ce4b402eef0c29a80b9b0f334a7d9f33b5984d489a1d30ddbe845c424104679e987905f549297cf52b3ca1514c22757d6ae50a50b402ec77b69d6f0863e3e8c98bd0e01ecd23ae0d721f7a230815976541b40cb3366dcc5273e5644c4cfa4f2eea2f1d386e74f06f95bc41f9a48ee21151f5612b7bbe3d15e2e715421911da5b9bbfd8a5c4726d8ff91b1e071eb7438cfa6dd6f96b1d7ba83fdb49fa6b37c51f4580669e8d02647c932f1e2edd19", - "3ddc7cc83f77c2c955f9b62b7a85e80fe0d8766530bfbf26e3c95b47219c1114", + "d9105749dc7865ce0769f93864a1872fd8d9c9ada8458ced60ca5ff85ed69bc3f5e2f9ee8905d440db47de5603e05605a3825f9d129cef67e303c7c659c8658ab51ab1a1605fd42b72ea72f4f910f4e9328599db02db3e9c11b6e01e61b8e50118bcbf5c47e0f677aee55f05364f015d8522a59cecdd7823799321a4ffaf33de2841ebf81395e6cd40c0f2c8c2dd65069aec3c985eb24a62537d5eb53268d3efb5b8a19393ed32203f7f4c09c45b3f3a5f72b39a30a1348dd01e3bc0291d6e15", + "1c9380bd8909ae27ddda81d2dfc60b026a57cb0f7acdb81529ff2d3d4bcb8f1a", 1, - "2a969fb7f284c4541faf1eb3377df4abcaac8a7f3249ef4551dc15b10cabd1bf2bc2a96dd236d3cecad81190e16ba41002d17be3ac576f5bfd9d707b07db3f6998bcac664bd1e2748ef73a5d006be33880a81ae9739eb7d2559bbcf75d339100c93e170ec7e792fd6172f87ce89626f5bfa4801dfdab4975f0c974cebb78516ca50313c7e7dd8ad817df4e6145bbc6167a4ef11788579968b1dc9e3af2264783abb93e614e4962e9cebe93b0fdf80046592cb907a9a78fb415915aec4223b60dc7c3b9aff719548b347b0cb2d5b723f98211e9110b459224c85f285f93f0faad9356610c8ee70b97d863fed55c036016a44f7f1f43fd0043a93ddc42ec5f4456f61bfe87840395c2ea5525b80aa366cdbe3a8b65d98861d0ffee45085dc8c608", + "5461397d46d903f3323bff6ca21a126972081cc5cd48d7bde89b213617baf1332d569044b1a011bdeecb9c3e0281e00016e1c75621fbd582a2be1e05fb8daddcde21b176f27be73062ca7a88f1cf261aead14c5ca2e30313dc7fe79ae63521088805d8cd435d7d2137010226215698f05932c43c0a5e6cf0bcab335453151a2be3ef098f31707a71380f0908d5d08c066cea9b27c98190a563ac810fb1f7f1349c0af6e93d132b267a8ad5b609e81a85e635b6e34409935084a50f294afa9c01", return_code::success }, { - "7bf7545801564b8ee91322690f6495dbe6d97775dc1b016d4ef381c9de8aafe3d9b59144065400978635b3f0ee55df0491478d53799662535ca8df5a3801ca08d0425cf0ebb1b7b0ef8dcdb58786b739724d45eff00a0bd4096a9fdf6df7d200d1c846443d604460df8d965c4e6459e2eb70737c5713400ad43aca2cc29f0948a5fb51d33646ed2e10760d0f33d7400d0821a5527a7f8296645b5879a208bbdfb647b5825e0b5fe50a5ec2cff163bf5357fd7abc79c9b6930d64693716ed2d15a310ef21e1fd5e64cf781ce0ee47ca3762fcf411d9e9dfe47584bcc8462fcad208cfaaf9c82f1bdfee2fa3c99d6b2a0e751e342db7cd57c0e1416f0f1cb3e2d23971d62156d962be56eaf937c0190f65f4fbf345dab0d5fef594e46d73c71413", - "3e6840207347e51e921476e0c5890201169aa46aadfa7408a94063d94826d70b", + "cea074de7522910e8009b69c3ce1d2cb804304785bca15ed28050aab01d20fb2d69fece1b42708fdfb9412719c27fc00170001c15670fb55a90b9c835b125116748097154afb3a24d66c2d5750ce539fee5f0ebd79e3505be1efa38ff6663005dbd34666a804e2a854e3f29700946af83b987c278d083a16d46d2f5f82e0bbe9e8d88c47d1580b3f82d9b5e521074a13100ff61f6c78b84bc6e2b1a7b8b1f589451b822e6557cbc7133ce3a5d39b4c3764abecee70229b49383c5625066bd00f", + "36403d3257657c772d483746bb7b6a10d63f40a66da0b22f8365a8e26c09ce51", 1, - "9c91de3ee8b232de3bd146e8b9b6a16ea3ad7c02e962ce2a50c542dad854b2efdfda991643dbd8ee01c573052c83f50394da59183e16ba56ea1e16023f661542e989f85b901b88cf39fe099d8aecff9fd86542252410ed3377c93b7a6315e113bbc5cbe103b3dba29c5b25b77ca827a15a38c3a7701dadc9e1e3f6558defd3172a97564f807309e7bd275c508974380b886dcb2ed9dc3d5c62a00d2e84855ebe7399d150416e69a8ca953522b8da8592b216fc7e49e614e792cd4016cbf0e103b3b3d8ae164b2d2a58059829bd5914977040dc3d0e4f374568e662033acd9c54c14019f71ae6c7c4cc333d5b6dbb8215ef085b3981b0b5409a1090072e2b50283741d573ba4c08e849b1101890b0190f9b49485eb99c9cf9e109d21a88a1c806", + "e50e935d79a4d6a6c1e2eb2f29cff5fa160f047e0b20bce65d3ce99063031f11bc8890d21433fe4e51ad6515d4c2b901ffac8f33f4a43739accf8631bc1fee7dd54bee170d532028135b52b261da128c6283e2ae1dcd9ad31c2fd3875f37c3152b7cacf00ac70c66514a7fa5a3f58a3d91073ed345e354698fe0b8a503b9143f6e56e90893f0dbaac02e999f75f7e30615406f28d46ee50a16e510584de37f43352974b8c19486a66450934caa2ee0f59fb0daf78ce9f6db268f586b5e5fe305", return_code::success }, { - "98ff63938319e13beb5bae7d26f54f7cc5d639eb7ae207ce0d1d3d3f480286c0b83acc6692354a55fdf32e4e737aa8094e2081bf5958e4599da575e28e29cf17ca35cc6271c8ccf93341f39910cdc5c5431ba1fafe780de241223524b0cbe718669ae90f424f963be8509e56dc5197f24e732a80c2e5b761a754e8f8c73e35c0c7fcba00e7add9509d86c5529b735c18d88c76c7d7911800d05a91ab487fbb1578dcb4488c36035df08fa1424b2a8147894bfc86eb4dbd92a059d51f980acb112a7a145d317de527320444e2ca091901824e24202acf199a06d56774fbad1fef47c3516a415e88f374bcb7dafc58090087e09c28fe2228be0221afe6cec3cfec4406db4ec0383517a9d1290590729ed9a557a3fe2bac0093cdb0e6778560b91277ae4e16116167a9411460635e349ba1da161fb122d962b3bdcb773b5dbbecf0cd107f9f12d605dcd0ff834f558cc418b632249f2c3c54320f677cb1d28207a42b83bb13b2a0b30cc41f33f29d5f960190854671b1ee1f25345152155fb8fc13daa09b5911a10b6884e80de8e9ff1976abc79f08cc6b0be2dbf49b651f46a8f344f3b832ce91bbb82c109236fd6bb206566e449138032833c3c40754f19d294f04d9ac2d24948a122209fb07749c2887a10baf417f110d6ce6cca80daae3e7115fee2cc7d70cdabd811ff78e7250216ec739311176c6dfabf3b53caaf66a0528d17d4a382ce1802b7dbf801740ccf813499f5ca7a70ca5ee9a01e874e267032ead1b95046850b1cade80bc06e6ee5144c520b5a2b7d7ecbe400b9b6e77e1360920f0502f3d7dca0558239d634f399f9af8745c6085f8a894233226e385b253ee7f4038f5a42755ea61606d219e11e70321b48827d87d5eac14f433a0638e536ce0eee04a714e3e6b3c2f57d5620d9ac51b6b1663abd099cb3faf9be52eb30b15407aac7ea561b47e6967a96acbdb42690ef693c6d07934fc0b4f17e04f51ecdc8915e762ae4dfc151178f06887ec6518f706001f0d50827bff24f0ac16d2d326301b111108b35f1b98b2688f6c327a65ed0ea337851d066754d531d51fca7412f0982e4c4ef21773179f24997a42f8a4d6f339afabd999256debd612450539d0cceacfe8609bb6be7ce7c594ddc4190adf70dc877087185bfaecd62a5b53d68e4b5e3d2a143cfefbdb4bb639e856712f0f5eecfd8ffdd6ce08684edeedd6e00e59e779485f80a188efea52a8a0c9d7d63cdf32f9366629a059a997323ec561ce0e43011e498977b1359763e4db72f5078946d2a7757a1add988d9d81bfdda48a30cdd24be7fb010e91a82ef42b266849b513c62445cc0b58e54cd20b389889001291f455538775c3fda0f9b0ec9c875f9a9906c4cb4bfa68ed1300fe62682c1a217912258ab3026f4fad3822775751083e36f8b41c6fec90b23b0a53b01509d14298c11a4f2da42dc3002a5429086cac69346e98015f0641a55f87ee8e62241936c38d125cfed2f240d25d3ce72efe1aa913020d1de74555b0cfbc494d6de29eb09af18c2c89e77ab461a2c9f7015111283bb4adfa1c08c3dd0f3850089128c04859f140d31d1ed22edabb7235604ed8056a5600f7f1c09a1a8eb296f6777801", - "48a9410a2a1ece4c2060089d43d5823e050e7b37cfe62f1c1f02eaba0c4f65150245659e35fda0a14c2a9e8b28d08553dd25445522924f1f6d91136c630a08581980e744c18ff77fc5d5bcdf2d88da37da96c874a3154a023b2435ba7c40b6552900c95db9c62446cfde76bfaddce339852684ccb18f6c0ac737020c339c0346", + "556524e3e80fcf448c0befd659ad744c409cdd1111291a81949324a02688999ab88e6ccb3e9dcecf57ccfe9aa7ada21540ba5407c0700ce81578bcee892ed385dd1ed476c465fe48cea2dd7e37784d8ae795fba842ce0f88baa76857ec1c7c137163beed84ff2c6a159d486d10c7128b2cbb6f10c547d202d0f6e68fb43a9a6a18a01823c4e70b5dc25d38b9c33d4916510de467f10922f3b284855c4accc816f542fe74fd0b331b1884dac6918d3c38860b0725809a19b6101e5d3942b9f40eee6901e17a0c50187e6385767b7d1e54eaacbb3c1939e2e995ec79569dd0200583a937891035475e1e5a733a0446f7063e77f9d564c60dfc6dc25572369bf7fe51b2607f73fd0fa9eee9d27b127a81c63bbd7f08dd64237d082e9735018d96024c56d32b55e991e84f39c6ffc0d56ef17307e82fc200df9259f83b7bdae719124f7151d855b8f51f703e087ea1540900c4eba1592de051db895689aeb5233dec52ccb74f93acc8fc14bcde4413a14dceb0ec386623021ddf9ad1fce429e1780c5a6877b00b17af384fd49b7077434387672218967f4a7647174162c07e99d9007380be10a7bef367181ba886a0e40c160a4b36548826c30710ea8238b0c37ec06e331fe1d3aaf1b5a73ae0880794d0c0a9623b8498d9bbd4754e1a8c1e2346091fec42aaeddc40f2ae06456e8ad9059c61db437089a855af3d1bc2a6d68e9c01474bdbaabfa185a58dba9808f8e0b20a3c51c51c5bca629aa061dfa5ff238a43e1e90242df403635869743c723276c0eca711c6c91b94a65310b6b869ee556179ed113a2b406a52de2fe54f61f4589f510924b2e3f8b14ead1541af2e1cc9dd35a91f6cd4bbc02c58a844d9e4906a106197b8ab39a539561aeecd265762bcf5106344ae2fe0a62c7af1bbc846e9b39ebe38a046461d7c0c4901caddb0fd7c70b86246d53bf3124af629596f6367e86f3456cc954e3581bfea600b6d2818259332fedeb88ece673626ffd4d5935d0310e5cf2462055d5fa4b6cc4531f11cf0722c8647dbfc7364c9b2e24e0066ef5b0e3497ce38537a7230e02f7edc2f53e980f", + "e5a6afde5d144ed43bd1742b7ec7f5385a7d392f65465927e37afe7b9f0a9e368449cf52e36ca432b096f8562c98f318216d21a426b2d51f0a4db8fcafcd687326b548cd973f30d4fc47d79d853ec94239c620229ea0632b2570a1f8df08fe1ce323ef2cad610917a13d1157e25fac05ef6bafaa68e8ce265594d207a5d13c1e", 4, - "b8e6b7bad865d19f191d25373c675d3f03cd4041c5b84b1832ec9cc9ed1297511025a1292f84d8afc2b9296647a3ca16502ff327965c37ae9d233f90f288d670e8f4b66d7ca8496fd7e09a0daceb0d93cea5a178b33507d9d2cfeab4580a1b145beb7ce5a0990e99759eedd14e601cb0ddaf478dffc98a87ce4705b98d91ce3f1d7f6322dbcab5e27057bc28c1a0f60451408b08d878bca1f2afead2921e1f9307d9c7c50ce92bf9727c0f375e280c767097dd0857151a8aab622b3dcaf197156e43a53e8fa03eab5bc213d217045515f62dcd5c68ae8c180afac5eabbd20e4f8052db79b6cb97276060dd16af90580d36a142b7bed1a8a5e8aa06221251ac9753d223c56927310566650fc55607610e170437af34c2e3ff493fe55a69c5dc10", + "889d8b750987cbce4aa4b872b29f22011752354e672b24ad4b229ca575ce14a8c081366db5cfd0f7a85ff68559bd4216b3cecfb6a2618a29c6c95b17147d083f28cc1fae5959fd7de74d986e7fd543ce1060cbdd8d4ae136910d8a15a1b3ee16d955657630d5f50aae107d13aa0c46040616e2d3018e5d07f9551e2a4c34565c9b59b8fd7751e025f473772120b4a511946e09fc93dcf9732399244c1fbb864fa09c2dd5d29543e794e64b6e1a2df39289245ff4b65dff0357a6621d151e4514", return_code::success }, { - "75387ce4cf7b8472949c128e1418d38f4932677db207ccd28d1c6a498bc24ff91f49d69c991c6ae3d15c26f761b51b0fc46bcaf260173a59ba6e7eb49ba671a3d3dd587313b43bbdb6be6ab2d469d77c6836d227f1116261191eaae3c93b3408e7b3026880a98b719ff2f45a334384178850aa666db9ef17a75f4ce6144cee080bdc0f5defcf6549ddd3bbe275a00e11dee805451b1d431b59bbc78eb38aa00e8f9bca043ab92c24f05a252949e33d4ad10d90d38063c4a73a2551a1068bf613ade87482b842f06d93011563cd8b5fb860883ccc23c78845b28d641a9adcb30940ef5ee1d022f1414946719ee913250378849f9e4bb00304773bbd1109f79d37bab2a66d36c7d48f197d2ea9b263f425e8bfbb360b327793362ed75e353f7d04376b535cb824137ca6d40ba849d5e92566173d520f5a8cfd838266c90d80625dc1b78df6fed60c51a524cba5d74b6a00628adbe7e90d92e601946c166463f24e8d5508154265f5b1be25ca100e6db502a65681c1cdf6d9a922b1c373f3e2fb1967a4d5753b1a0a6ccd6430df5ebf2a1dd663921f0ada568d3fba68e339925f9f520649557cc600cda6bdbb30fba7c116705ee98858b3d0fc8e82a70587b21579de3dd175e8d252ef3a8ffa1f9b559a57a012c880102a4289250438151e7f630563910fc6d5b053a0d843149afad7b637dd851f141422aff972a9ec383111733153fe5d8fadc6f6d37ee872595c4bdf144067ab39dd736862cebcaba1d599c02af7ca091df1eddd30f901c8ad353c04db07c3fc2c31e9279f2bddb38dff85ac0c59bfd234428019fdf7c935a8db5d4cbd4f8c99abc077e805efd729b67bcc05bbf419d5f1cd36268495d79c258a8c0207f10b30a54f3a291499e22ad20c8fc6d0583b66dadaab1c14f2770a92b134b8b257373a4cb3f760bed88aa50174493b1817aa16bbf5c5e9994782d3ad7f1cbca4c4e870398b207a66ded6350dbbad80812aef94e94391740f72bd9910209ed200542bcd5d6b5252008f7d91aca39c05863b0605d704da2d19427275916c763d95837dbe7a8feea999ffd760fcceebaa16c37789b67a9e0754e0aac7a842fe5421a6fb204315f2ea61ef6da436dd16fe2b83f5ea035a40c0dbed588e300b8d4a08176394da6e7dba73097123c2b48017a462ffae48835908d56314faf0993a9b69af072075217d261924b9085a2d9ee7105e36079a7813d1862eddfa7727d14e6ce949f83023d84070e0f19e980220d9d5a46f5f0a3d7b533abf60e9deba859c19762ab2ac5bb648b43c2dbdfd87c91333c6a2a91488ab7efd117849b7552ea442a5f47e099458ad74ae02ab028ebe44155fad5693b5e04f8e36b82e4bff5cfa2008077f58b3185e3b775f39befd9248d9d031f29956ccbf3b8a261b3879b41211235521d1efa233235c6a86fe65b40ec7cfd2ba7bbf751c8d55949a8968182dfb984dcf57264e0b393c40b538d4c3940e117a9023e392a6478a0a1636ac56c58b6c09e0ecf5a50cc74c427dda487f14de8baa5f3fadb086f7d14eb73e5abdfd15a4442435f81ee76e34e70c73f9ddb37d70b09f6599863c8e3284b95ad61fbeaad221fa8c479f261b5f10c86865663612", - "b4ae65e9e683c913ab592d1635b2f225ab9b53b10ab2c00e354846cf0c3a8910f25a4505a266f1680e8e2f3829623b220ec00c659f85d123071c3358b5fd8264307d2e145ce8949c226980eb5ff4940501307bb1f945501eec5c561c2b111c01a3aa407a8df0ac14c9930109aee2d8257dc9b603f67ffa23aedb695a85097d1a", + "3540d57f375cc54311317a2667ca62928a2cbffa3c1ef6a8227786b7c7c798b35a49ebfd7e29a92fd708ebcfcf34b90dbab296700beb73def3519258330910d131274149db20d2e90b0f088062c46fc0283eafce98c613ec797295cd1a2ea402c7ab724bd078bf98def513700a93a1525e8649adf9ade01f5929158f663a06bc899dde984b7469b9f3e4ef244561bb03d3764a30cd681216a6ccee7445032f8e4e562f2648c4f5aebbf8922c78f798c416af6a623da07dce71919ca56f906e19cbf8f05bce6dd49b34b038806af234c1d96269bb9043599049f0e582e8c94172682a326cf23df050f557ca0ec478c21038dfcf2f4785e4a4972a2b42b4e22ebec4a967adec4d5fa620c1afc9f3b2b8688a3b38ff3f51655b1aed776dd386b20aa2644a64366fb2f105efc45f1f552cbbc8ba6bc81b79314390fb246bff3f1f72a949127693d994e36d57df66141e0c1345ea0537c47cdc3b06253f69da0e77eddd96a0c0a1a51396cfdb85322a1d300cb673c4199989572d50d248924fad7d099d599360321906891e1b8ba1d417c791d42a01ce84ce390d46458346bf52587814f7530269244a7a8a74a95bb603da0ab8079f78631414763d5ed174dddcc63e141ffbdecf006648e3891bf96be79e9f977165b0c930547042c2e61cf3edde01159e83b909d75fc40409ea85f1941f0970d18074f2254668ca7f4ec7a3db06478985e95e410babe7166bd56beedd7f153298e6d8472d7188c8c280bfc091c131ea531d5c6b90bea9af1dd7167eaad78211d48f38d6be7543c60869fda5d9210c54200ce434988ce1362f33fec2f5fe787df83e127d26444a10a38c25ee3b8d93b32513d5d74d9d9b5788bdd9b268f20ec190280559e67a1a4e542b13281eb60e20725aa8b4abb5fc0b42589998a16850facb763b786736de04c7f9dbf2dbcf138cc21ffc339fd4b7f581757d6cfd42a392fca13b9d1b89419a68e4ad10aa9dbb3826849292d7c1b5f1d8750102056701dc89f6587f969e3cff756d706ecbb3044bd90af7b8eab6ee83592f26a930beccfa662b5135a70ac65a96c87a4e095c0a", + "d967d13a0bb8346d92f94c3f91f6b2040d736a0ffe01c11e0ee08891934d3a21e0598fdcb1f3bd5ddd88dddb9a41af4ff8aa8e47a0e992068b0d60c75bbc0d450ad8b46a274c18303e69e4e8dc4df5518166abaccbe2a80539389bcf53d033159aa7b0bb79d32a24e835cf7075bb96154656f7122216970081f533a1971cbf50", 4, - "8ed42492918a86e5fef0063d0159af9fbeb85fb55f6515154ffd0c0374de5e1b21fcdd8fb32c297917b4ccf124bb750f11f2b91a0c47516854ad0dad3d7ce801ded19deb6a7222b58c43b1f569b54a5d903a7c270bc1c3a90f604d7c27cb51008095fe6633c8bfd7f0714cf20014de9c854bdc17d0eee63504249e3e04d2a8fbac9a3c4f65c4f6b438be5aeb937b2f126c4783dcf550868c59b627954c505395c1e316dd237e082f5e2e712db2fd55214578f2c993cb3fb434c752b81d6236169b3f2f30731c9fad762cdf1598b525cbae27fc4b76758b20eb8af6e734a258d590e9b735d6163c02d2c7ee6313446413319a8dc51d8d5132f22153b693561389ee90b9e5740a244295d254fec13e5cdd7bd55998898316797c68fff1bf33d512", + "cabfc22b5e8228db0e18a378ece2e370d7aaf6c8c458feed8aeb64bf994a0b01aee824d99af50a8c67f9a170e70f7e12de79a98715e7a4a06d5b239ef0130b7fb183b36dc36458866d784c93cf6a7a33cfdf9e2584a353c5989b8775445e2c0bf45ce53bcb070562198a62cfa45d71f00705327ad1ab3e225bda5bf959c2714c96da0e99a3e2f8ccf54548f3f9bf56056d6fd87885684cf9d51bf305a9230cbf5712f72704f58e60e4c66c62fb2c7b3c559c5588c296b445bdab40ad0d0ac313", return_code::success }, { - "3998df17210f3e814d6bb0e743184f82321f243b9cba7d965dd9ceabc1cdacf54726b994369161906ab8ba10ed94c002fa242b82c4fe9bfc774bc0cedc3be2cc8668a1f5b07f32215b711da58fb14813e94cb97b5f9c1be11b505da863d0fb1894a7247d770687ce86fbfef583763eabc6e12e82073762142631ed576312b0beb07e933adb342c0f9882b20435d05019e13b074112d96c8827504ddba5654591d8001cc233e4648c40b966eab36d3a89d4470e94f0ba505859f447f80c5bf01442430442194b26334273727234d519075dc6a7f2a2782d5e0073ed7171dfef62999deee900bc557378893baad5714712b71668f3957d1bb87736015b4c0ed6ef24ee3647771e6ad913ff55590658427eff01272bb87ab4caa82ce8e5ac967911f19911aea7fb3da3711144c2d18325bcf899c3ba3ff1ebd4d2f6d45082a86233382bbd38b6fd0cbcff6c74d14b4c6a06376bc527211403b4285f1f4dfed47ad8a0494dd93db82d5afc02cf422df7134516d2b00c7c878091184cc20ccbdeeb0b70cc22d4100bfaf1ea8bcb13076da4dda9a60f60f88e7ab1c92956f378a753a13b3489b5a2015f14f41605e970d4da068527342540d6f57bd8892d6fbe8bbafd32e333b6c257ba6fa4073b715b0327b559fa562fcb16a886b3cd8a6d27d96806e3e7efd32ee03e03dc9cd6104175629523e8cc5730a03b5fe2c9176af4b0d73cdd654b81cb14bb44d54b9f0f3b184315978748e0c6a2731bf6d3bedf5088108cdae944ce40fa8b5b09b1458e11ba8fa79007dc043d55a7e99d037fc00eb408195855d8dc4e8376c60f66f55c1a16b11abfd96369d3cde62333aa0cd14d9968ffeb0783a656866d7054d2477150514f0e0435c7a4d0301fe604d03672d41fee5e04f449e949f91409329a3ecdeaaaa27e3ea28d288951dd512a93a94d3d6c910f8a93546f5de500a8690fe70dd59fb69e5d8b29d8cc1b95c47cef278fde33b26f32a6188dba7ed4dafd37cbbe2baea40d955e5f914bbdb31ab81f1dec6bce1ca2247929e3e80b80f086072bd271d21b594e3b789fb5dc873936e78ffa6f449b0e5db21376114aa3cc2da4caaa114b4d1b4cebc09bc1012ca388daf407ded70a05111d502e921f74ab24c9c26f249104046350db0e7ad39fdf033bd0383ae641873f8abfa2e3724e45751cfde59919f63e18feb420f4db75bbe067b8db1ee7a50a147821e50d30ca4f1e9ff54b9ae2df3234d08be1f648c1995c858dacb66e9b476e7175b007c15cbf2b129508e5cf8e029673761fb43796a9af6ebf9a75a950c9bad74d16243b95d7dcc9cbe2670ca6b2f0068d7368c35ded963187955276e1157868b3e02489481540ab9b46ac14b258d96936ee2fac67a655681bc261bf3b5d48e0a483ffd3e9f2231ac516fc8a1c06c5cb68efa822688afb03f823a512a0197b4092009199e8655eca47b0d5fa4af82d03dcaa45259eb3c2a3bc4f37c3f7198679b9ec48fa3dd145359ff0532993aba1ddf7f8d3cca01fcf758b650276d686d3aa04df8f39d4c221822093b15bc70d895a558ac4dab0f558763caecc4e3c15c4dc416988c52ab3320e471d64b446c58d738a31d60942b57ad9cb800ba4330e", - "cb18d3525c80ec237373be45fee17c2b24c5281f88613721f6285742cff4fa35101fcd043f78c6dd72e754515bccbb1dcc793c6a0dccd71f1e9f1a5e27b534389470eb12e82bd5310c9baa2a8cd9c148f97e641e2f22390453783b158a4606580776c370be1871c4e209b9e84e316e3c459e05f7028690185e76d1bc41f2116d", + "8fa138fb8d71f2baec299c896318eba0bb29eb5403f83ddba8b53550dac08fc4bccb2a21a7dd515e68ba2f0b7cc3e00bfaa38105cc84bc067185d9738c8e49f70ab5c101c6d582d90ffe819d71d72d6970081625966d0e022147fa0117c02e1929c7106d8860a5ab8f91afee930ee07cfbba1fc39e40a31fccc0413e3ee697f3397838975de2f618725b022bbfde9d18edaaaa5d2520bbb5d4fc35d9e0044e6def35e654663ec291a5402bef11afb06922f14ee586b7f01f4fdd68e723c7f20ba29d733ca6ef99feb281b7ba3ad4de179b02a4ce2ea5d16de687ebbb06ca5c653cd29e9225b257885a95d884d6db2014416a9e2a07381ba189bce0cdee2eb5a4ed0c357f72e3d7b053dfa8a27af3a4f69c69a4a8e6c94e856121453bbb46da0356557508a870145a80cab307a1fda298cb3719155109511aeb5446a2337353e49dc768f654883e919a17a21b1f8168098ed4bc817cadf2a51c5c1ca04b6692cbb1f492deecc9a84011619cddedaefe3ae0ad63678e081450047e4f7566326309cf6cef7fa32b46b8831a083c3c0dc124932a816dda7fd2c21f820b062f99243a9657979dda129e45c28e2ec56d6e48142f8156220b9a84d5832d796fa53a516194d74f6e06d197c763aac10f192f1e1e0771a287dfbd8f97ad1158426181be18766625778c862ff15b685eff2e64a7deafdc2368160a7c49107720a93024676d617a17c85a11dd298c608f717b4a3910101ef4d7711390ba30bc6010417a679b51a1bbc7ff82c7f7965d252a5b86bc731a162e07e54057ad5df805da25ab3d0370865000ebe59b18c26ed2bce5c5ae0542a596bbdbf76059efc13fb259ad286d97e3eb2e85dc089312b07125e5fe2a0fb8607aa566f6da9ad0e617fbf99cd5cbfedf5f0a894c80197ab32035cc3312e422c1c2513ca867add0861b4de4b0060263df6d82d9f43733961700970ea943dbf58cea1655bc800c3447d539568023ff91cf86ec09cee91de450f8c9114c4f1181e77e03bda275ff1ed367dffcc6db31ac55c855edd418ea8adf79fb97d5fce565597821082e2fec7d54e978544d9712", + "3d7af1a45d973d872e4472fac861b931adeaebe2c3b2a114a7726bb9db4cec6dd4e86dd4d674dc07fb8b96fbc5eb6b208374020c06cd751a74f0909e95c07844f3751cfdb402c4e3561f8211cfdfb4359f7346a6df61181eb149d35be87b2b169dade9c3fd4eba680d0689737beb2023db34560ecae6a521e474c16170629762", 4, - "13376624734809dd6912bcac5fca9170f7ef6baad99a3b08778cad1687281be060d8f74ef18dc949f90b0a82f71d0319b8af17e762d4477670c6af589382bdb3dee071cab2142a4eb3106a6b58b5e8023005d660a509fa864a3fb2e3a918321391b30e4a928a8742b7747f74680e6536fef8422ecb3fb1a5e7cc3f122bb60df2d4b93d7590442639794070bc01ded2066c71913c94dbe504e3b75b095d7c6097b3770e6ebc9e013e0cc81c4f5fae10db1364b419de2a7be093a8c5b02c88b018e6b99ff21ccea083789ab3e0454d5c36d475a4704db70ee4a53ddf7ea04844219980c2edf17fa408ea53dbd804b76515ff7fe39d3d03d77abbd260f32aaeac89b86c9aa5a1f4f63e25e95d4b9bdbe00338a3a52cebd6541ca7c5486d630cd202", + "9f599083020c7d2ebbaad85d4ab32fa09002b0eea60790d08cb8658180e3da5cac00a162e30f5bfa74a4f0ad54211111e5ceff16c896a18bd984de8d2f14b9a2645c9afc4f0db8f9d7a5ebbfc041e8c88b2d30507f566527233ed157b184bc0a05dd624cdc0bc714dbc658f2316c9b56e66a48cf3cae2b5ff6138fa8264c6ca727d882976300e09962eaffccd7259e19f04fa19ce0a657ffb68b66f494db4fc7bf824263749e8b1a188937d02fc2efc07c489f3c69f12b4ba8ca54a2dd495414", return_code::success }, }; @@ -407,39 +407,39 @@ BOOST_AUTO_TEST_CASE( bls_testpairing ) { try { const std::vector tests = { // g1::one, g2::one { - "bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f117e1e7c5462923aa0ce48a88a244c73cd0edb3042ccb18db00f60ad0d595e0f5fce48a1d74ed309ea0f1a0aae381f4b308010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "b8bd21c1c85680d4efbb05a82603ac0b77d1e37a640b51b4023b40fad47ae4c65110c52d27050826910a8ff0b2a24a027e2b045d057dace5575d941312f14c3349507fdcbb61dab51ab62099d0d06b59654f2788a0d3ac7d609f7152602be0130128b808865493e189a2ac3bccc93a922cd16051699a426da7d3bd8caa9bfdad1a352edac6cdc98c116e7d7227d5e50cbe795ff05f07a9aaa11dec5c270d373fab992e57ab927426af63a7857e283ecb998bc22bb0d2ac32cc34a72ea0c40606010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f117e1e7c5462923aa0ce48a88a244c73cd0edb3042ccb18db00f60ad0d595e0f5fce48a1d74ed309ea0f1a0aae381f4b308", + "b8bd21c1c85680d4efbb05a82603ac0b77d1e37a640b51b4023b40fad47ae4c65110c52d27050826910a8ff0b2a24a027e2b045d057dace5575d941312f14c3349507fdcbb61dab51ab62099d0d06b59654f2788a0d3ac7d609f7152602be0130128b808865493e189a2ac3bccc93a922cd16051699a426da7d3bd8caa9bfdad1a352edac6cdc98c116e7d7227d5e50cbe795ff05f07a9aaa11dec5c270d373fab992e57ab927426af63a7857e283ecb998bc22bb0d2ac32cc34a72ea0c40606", 1, "b68917caaa0543a808c53908f694d1b6e7b38de90ce9d83d505ca1ef1b442d2727d7d06831d8b2a7920afc71d8eb50120f17a0ea982a88591d9f43503e94a8f1abaf2e4589f65aafb7923c484540a868883432a5c60e75860b11e5465b1c9a08873ec29e844c1c888cb396933057ffdd541b03a5220eda16b2b3a6728ea678034ce39c6839f20397202d7c5c44bb68134f93193cec215031b17399577a1de5ff1f5b0666bdd8907c61a7651e4e79e0372951505a07fa73c25788db6eb8023519a5aa97b51f1cad1d43d8aabbff4dc319c79a58cafc035218747c2f75daf8f2fb7c00c44da85b129113173d4722f5b201b6b4454062e9ea8ba78c5ca3cadaf7238b47bace5ce561804ae16b8f4b63da4645b8457a93793cbd64a7254f150781019de87ee42682940f3e70a88683d512bb2c3fb7b2434da5dedbb2d0b3fb8487c84da0d5c315bdd69c46fb05d23763f2191aabd5d5c2e12a10b8f002ff681bfd1b2ee0bf619d80d2a795eb22f2aa7b85d5ffb671a70c94809f0dafc5b73ea2fb0657bae23373b4931bc9fa321e8848ef78894e987bff150d7d671aee30b3931ac8c50e0b3b0868effc38bf48cd24b4b811a2995ac2a09122bed9fd9fa0c510a87b10290836ad06c8203397b56a78e9a0c61c77e56ccb4f1bc3d3fcaea7550f3503efe30f2d24f00891cb45620605fcfaa4292687b3a7db7c1c0554a93579e889a121fd8f72649b2402996a084d2381c5043166673b3849e4fd1e7ee4af24aa8ed443f56dfd6b68ffde4435a92cd7a4ac3bc77e1ad0cb728606cf08bf6386e5410f", return_code::success }, { - "0ee342698bb6d96f5862e208f46e02b2f1afe99e975c6cae2f843ef50091e72e6171836ebe8e093c79c718ddda8a3915f2a17975b7174deef1a0cd449a544598028fb9966c4e07d55efca7cbc123ab1b0eac14f5c5143abdadac359f5e0a83150100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001dddf8e5208b9dea3576cea6a4ebafc886e7d49e6ffc7229e9e624c3e5a76907aab2c4eabc486489c90108f5b6cd7e161a54da1d12074d5032690f3b1124bd1b3a4f0772ec2027a901528b77906a3ade7095ff8fffcec018039b0b130cacbc1301000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000097f1e7dd8bc500dab7bee0fa9d6ece17468c80e6cefe99c750c97b3f9fb2d5c705a9a76f6cd3d0dfb98455eb2901b0037819d28e7396ca05f6762cc4199314cafba4d88497f5b1b8d6b2c9757ba7cacf0be30b165c1b267cfd89d5366ae64500010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a806f813beb0f13c06fec0b8fb70eacec12d3c94d5a171f74d90c616d788ad56bc083b1d1ede17eb7adb88c7241c85194d264dcd282abd80390fd9e08270fb9ec01ca19f08fcb167d6c8db813517d85f41d3bf844339ae7c9142f33ae21e5718010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "7ee127783617cb4ef58361b4b760b9405bd596a9faadef2977e39acdc4479f4f48b333b7ee8fc5f046e2a1838534d50335caf5935bde4f3912848f869ddaf64a2a5bc96e35b0408de053bb61f9f6af33a1cda5fae130cab5f018d14caa534d172242fd5b249d752ab58d4dc6a75cbb3a70474a5a97bdb5e46e3d318e59528242ad832bb1dab5537134a77e1609d3fb07bb2e511f92b4d7a6ba393003a1b0605a743b9d9fbf51401d184a0dee8483fdb84d4e022ec838924bea2d87bd8b64f816010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000318a2aa7183338d070381cd936c5ed51560b6955eb710c235ef8dd2024e46ee18add02958f5e81cf9b63c76a9579250f73117ab5396fae7951934389c3fa2898aefee684eb091f24e08175b0c7d3f706d10a70d89ac355b41c73fa1fd8b825041788c011a785b7897e7b204863a33aa83bad42f84058de5f86ffe9164365d010af5d6942d04f204db93d3676ea530c1055a614277996f55cfb7ffebf6f1f4e77803c96ad61ddbe8797b15dec6065fc83b206549cb860a90174086465912fd9080100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005caced6097678c80eebf30819f32811653f02b0fffb38c595f3f21698fd7a9149e23ed9443fcd440d1105f74b32549069b424a7d2b39921e1aaeb52c964b88f9e3a62e9af8c2d0250ce5d05aeadd950399d6d76a416fe0ce54939ed7800d47065d65053eec226c31edcaafd8b343f1a7cf91a5ce818331f7ca37fbcfc13cf1d60bfd9294472af7a4cb7b796d1c1b390e7b50fd1bd3e3ba2cbd34eea6f64baab7e847698faf692aa29af20998edeb7633415c65f0e95f5acba7bd5bf4b93cc511010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000da9dd92b16538db8ca15156932138efb27793bf5950bb3b595efa580d2a05e00e932637ad80a88b1a91a7aaff72e6f19c30fcbc7b19e9b6746e18c649f576b80b1365c835f826a76bc55741388a96d98c84be96fe5d958c2a6071c14908f3d0cd68e45e0fb13f4307f665ce5cf5895912dc4cdd59b5653d01de11a23363bbc8b09ce6e3f19ad82afe0a089858f446b1305af6ac0c4e5faf6d7936df6383a82e4a8f647dfa1f40d00745d05bf5e9af76d7341bfcbd21baf6ff7c981a72d08d518010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "9242b29b93c61f033f960880f1f1fd98ab7a0973f4af51e116ccf7fddef30e969f81171672612d1b9e17506df16d94152f8ee0d5dd3659c8411d717dd03d0d9600597470cfe1d8acc3772d8ffad57152e78cd05ec59b3d5c8e0b1c8c89ede40a1c3ba9cddda02dd8bbc15562bdcaf2f1216c3c3763cf2578b2fb1dbd473b15e464c1e5060c1ce1985af46393c896c90f53593395b3830e85f203e559c191bbeda8e67b263cb1b0d2a9fe8232e2d513b25c90d42fff59770583546adb2f6de8133d2570b6ce051e42cef043f59838540ddd57d825d6b31bf85852059e0027f3cde7acd48d01ab7ff6a243a73046098702fe0ea3661ebd03aba475f8305bc40e2334e1affbba4fe683d9d86a82fbee2415899ef14edb8831393ba0dcc3bd496e12f6e44ef94f44de4fa3586008125e3f351c54e5c106339f26db74b4d5c675fce7471f9bb6ce6249d59b2b98dcd5b0e60135c42c797b19115242f897977e1980f1ee5f9687af05223da07d5a6012730ff07c735c3995e842bc09cbd4ff535cfe0d", + "e3e8508bf6727b1b0999f8b65ffbfd71ad2ecb67b9bee6c57467e97b1769d22d89f821fa9233a93f87c991e6f1671214abd95421f0ec7a3a805e890b204e78d9344121045507a28684b93993d223b7d977a318613be2dcf326353d067fed1f09bec07dfab6eebf20e14af2d2fc7935b4779e85dc255d9f87a4e7732767803abde70a794154a8eaa69ff36ac04db6f70ba27c17660b56b15a6f0b42e5b9e2a0031e371827a41be40416818490eae20ac3402387c543e456272bf477b4e6646c13fc29abad46163be661b80d8a99f8243c946702131a32695d0bebbf26ba23bae9e9cb6926544ac895e0ecf9e2ff9e1207e743434a148da90f6163bdcb0eaf78a877d2ded8445ad37f88428ace820a0e300ea8653a3dabdb402f3c1438a7549c097436783a40f6177716f0561785b1edd02a83b43d04a4b3858b158de8b74d334421dc9b2d8873b22ec51797142b6c9104948fa5c4746251791febf4cc62ed7afed4d4d5301168e0b5d5b7ada253f3f18988c3c8d3d4e06d1b819120068b2d59131e8e77e518d8cb791e3c022d88d3f8a6a78b7f6b31b54bad80ca6d5c74a24e2fc2514581bcaa06b4a4ce38f9aa3906173a1557bb089dcc5f4a0bb739610fbe5cf247dfe4eda2fede230efa823e772483cc4c1a1161ec617876db25a37e156002e8cb0b3dc76313c84429621452fe30b3dd1b160e7dd4f477ff8bea01d86786831f95d1c3d40e40cb0acddcdfcb9d39121af50414e4ac7a4d148c641c13d620c08b139b33d31f0d14e7fdd7b8afafa7385f7aac7b200d26e1ab6686b92c58dd17098b370dcc1b6257476dc3fa9e02bce297706cbd67eee816e3df38556a6bdd6f6c07187e4b51426734470a052d7fbe08fdee46b80f60ffb4a5337403c5a1f9f133a9c744a2e122e68e03ea41a6bdc00e0413030b065224f23ce7e3ebd99f261424bef4e4bbb4d31808c204c4c643da0a121a17a009043905a1dbab772d170df99031b46bb89acb0f57b6aab53528761713f00547c1c45afd31017b8f6477522461b28714e2c0f8643de662489ac0e01f33a8aaba642f48de3e04432e5ec7e203", 4, - "6a0a014eafa202e4302849b3fe5f80c8ee22c746ab61627cd7576fcd5b762cd7280042d0ea26d088a0c80622cda76410cb2059a83b7b4fb283727773931b1e209cfea44595b38491559e4f1f8d9839890c1da6e8b7b6cc4952e1458c0e50d313d01175b8cbcff7191cba5938864c804f1fd7f2ad8cb7ab99ae62b05bd8fd0cfb1eebc2a2eb69376529f5358870e73a0bc812dd065c74f5d95330ea20878406379a4b97203db11cdce74532bf8c4b7c2632d3a055371586ee886d22c280bafc17533735f06f551f7e318512a34da546ad00ade5b7567faf2fd5959c8a8048e599eba661ac3bf143cfa2e7c36baa5cf1017c531db1ead9e96e091bf6511b9de5d3c526f120cd6513fc2570a1c77018173a8d36ab92b735abe1160c010a827c1312d63492594733637d982068d93051a646087561d65832369481a10bf63791bb55d8411b3dc20579a73c9240262b3925073a769a55a74fd78e5900edee879cdf0d1b60652321454f87dc981b4b8d49e50d23e4b64eb4ceb47521a617154af1ec03d753fc92c5a42daa64f8933abecbaa71188a9ed03adfe37c6f178229688f0e546fec5c3bc283da3f83fa9ba448a194080efebdc4710154334367493fd9015be51ac6fec460add6ce0e80aec5c65f43379aa95e5bb867fd231e83a700490215104791fabd039a3b209c482fad27ddebdbf616bc16a3454d38ce192edc236de08bb266a74df608c4013a15e6ad1542fd1758589ac22983e14bc9396cdbe737da8acc486b96eb093021d2af944aca1299d7842a90c49eb32ec4f4b1bf3de3b80a15", + "3accf1d0f0e50270fc76410f57eaf2a96acc165eebce48e3c6cec5932cadfed270a698919156a54f923a262e3ef7941796c8cb3693d4365349fd2eee88dfd1e6b594582dddc512c32a780bcc426a97d87e1f76d7c6a15a559d2029fe6e0f3317be03dc9c4de6d95b33600d89f5f7210527e98c4533e4c6a2bcf19a460ea2a6cea375a2623647b05c643aa5f2c3a3f10f2bb589eaeabbf087cf5080a17f7a360ac9db7210eeaac2f02a52a571e37d8645c1217324cf657cb50ce73181512c0b0eccda43a3593cb2cbfa3bda81c31e16b7ec0cc8df0cd51d0871defa799d261baa652b2d56032ee9894c7c0d695c89250e4b83ecc53f2fbb6da14cf9c3d53f3936c16e050b0407e7bdaf7f47b7cfb814bee9d45addb7229d81e6e278aae4d1e30da342ac502f0d329ff2ce4abf72374fa858aa594bfa793c0baade9d54cc497dcb849dbc65f51d50fae34111e1e55eae0c0da4a2a5762a9acc594e8ce9a2a304b236b28b092762d6feca7765c42dbb06c11ce6c04ebedf8c11fabe2e473d6efe06ec39692962464216a1d30730aadc370f2fe59ebae19913890f14ee942f89f5f13471bc00b91be0c57280ffc253a8960e74bd6f1d13ca101094d917778b4d90381a64dc786630fe58359f9ac634efa11d10b4f2408357b8be3963a768d99ca301e7ae8e9df45be75cc3ba4f2968129cc6a9b0db9cb9c63e592dd6972c84f9b73c70653d7d4b89961746c68e23c49bde19fecfcdf6dc5c7fb3237aa448059428c4c136bde48a8ff5d748a7ce294514c507980d6b805fed1604d1c3b321f152b107", return_code::success }, { - "24dc1e4565f20fef3f2cbc0d4bbf52857dcfe43a01d762c3f17069d145ca558885b28c4c09d02f932b1837e8e67c8a0e541ce60417524f1f21aef285c9f5a24b37b52cf0d436ed310d23d45900f53ae297610365e2880424e6c1fe616b83651501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000056dd282484e3a3ee378a862640887806a7ec6c8bb7b761d96dcee583879c94eee4d9fc522931d13531da3be4f9fd421469a0d52add6a2469619f375fb253478a9f8bde27ed5596a3301a00b297607698c3d01ec22c60aae66cf274a3de1a480e01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082b4ddba8598df3c1cd5882beda98ed0565189b772442aafad93ff44e482a2ee8eb2ce469fc861d5eaceeba136e5af068fa30be80dc5ae11d0b91eab46c31ce51a76716d3b5ed52904e93b9e0773120188e02bf2f254e7411fc22b2967bf9405010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d856767795acd88b4d2036af32411a46f86e3164c1d3d7c5957de95ee65cec2c630e5e2c61a0fe85bf754c28c50d4f16102b8a7e881d646f4305862b2a545104eab522a2436e3bf0d27c9f6b63b8f92224ea1226a6dd1bce94a2514edb2df018010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "f52e9ed1085833f6833969804dff5becc53bc2ea6ed36e79fcc66aa1cf8305c2ea7eda94e5763477187f858e73ab43192aa512004c7d391c0fdb759f4312ee2e0c9b5e2e8822953b9da5c249750ed4879ae401126fa97e96ddbec247e7ae2402d6db4d7f8c09fdae0e725223ac225e1dd67abf82251221b341152f354ded1289eab076f4e6913035c46d17aa47a2ac0772ca37ae31f56cfc9072598da0b3c09a61122398a1a19566a6e530e8b22e1c17972a3bf5ebe3c21d973404452cd7cf100100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002cc290b2c5ea9270cb4cde570ad78bf9511425bf1a52722f1f334f8432e6fd5b4625dfce407d6acf5d399a26eb0c52144b94b35b81545b6318fafd796adc69650e1488087b2376c911c7db160fdfabe4a7828807baff5d99b63fc772f1542d0391916e77d1bff44a4a4bc3b0428a57c71730dea6ae556e1f16a450c9188b0e9d21713990b9a4a3eae42549a90c7a421538deaaf4c5c5f08394f969adfcd3dcf19df8095c91288694d68ec54089861308aa476ff186de9b4ff9f663d030824502010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ac0a7da30ea2219fda60a92fad492f043f3bad3672047826a49f2a155d39fb4060e0dad7b09a27f4e13a9c0fab351e02d8ed9bb6a7ca158a93a2d8f92c161eef2d044bc97f632ef611cc410e32c4211b666312f3a149d322214b226715324b11537fc75a01c59e103d5c04cbf9edc25713a659742d8b8ea2b2313c277cd7c855bdfff230bbece263ffcce222a20a370ee2cfea8b543f94f758f98d3c0874d497def5cf4602fccc8edcda8c164b49379d8ab67b622902e253f35eb81c2d641503010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bff971704983937d030eb335273dc92413925720b38782fa91158d8dc620a4e96545d3f3a061a11d6d7d7ae7da860c0bd6194f5958961d8362c7dfa0a2786bfb08c3f55a418834508d0d9af6dd0cd480802c2814a31f0df6861de3f2def3f50e9c71b9534fd269bb6e4e8c4e27f7fecffb7bf8a0f21e4d4a3fea63e62f45893f0b45220f9c1a0a0a9249f9aca00266018090884674705d336768b7e203c6972d1a967dbd1c746fe59c3d1a26ff9dab3b4b0e20fddbc1ad7da7410629b6f0b90a010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "41b907b27fd2eec91c730174063a74965d837b8363d37a4ce7257418c93260a8f47091b005c65846a962482ea7d35211e3ecf16ef2d0b6287d84ce5a95e93a00186b70c0735a2d5d5d3415d38ce3ae8f1dca1b4228dbda61cfd93f6f42548515ef052f0c5b90fb53c96b5bf27743038924bde786e1fe6a06c801bf2589e296518e48ccc00f5b8b64c02504ddb09a9c1036fa5eb15e85b1d38ecb20ab1c299c619493a6b4bb6e987d6d7759436a8e4671a7946dcf71043ecc04db3afc315f95040c15177bb50a2ace0c6b79e767266cf29d4cd384e78bac7390d93b52426c5d31f8fc8c2a0e2b574586aa8cdb47fa400c3cf7379f44aba3aa1dcd0484bc97e1d8e21a491405c615068e398b1c4461c14f01383b6a7d1ffd10b74801f248924d16db92e360ce2f1ad009004ee5f12badd416bf6e8953b8caad7e1b6a44790f68ae63d8e9dad23de7b6e377dae7ef877c0bbd88e55c1995f95a742adf1946ff116646b6f5ab6aaca20eed777430ebdd5c8e6042d18e51cdccdbdffc02bfad73a206", + "b035471f19385025b383e1829d57bb90532b7e8420fb6de22347d5499d70f30c905b267f3fe12c25af5d5358bf0c500475408754478a96e2ba512401ac903c7cf3bc225ec185dd61c03a67219cac0e836e49d071f3229e391d7c1b857cd93305ac168e05a05e2f451094db5bb2df0f14ad282e1d19f11de48540285183c91022b7066b635137149dec86813818af4d16ba7d5d356e8f9bc13eff6a02d59835842bc9b42a27e00e4fbd7bd4e8d5aa9ff3f8d318904f0fad0abed386557d153305740dd01b3f777ae822d9fbe6579506984be4a523898e17794321ca1e5289d3855d57944aa2df85263d4b718a0cb8c61564448b514ddb02ab4eedb093114dc5468901f6ed72863538a5a6c9523d703f9c66feff488d9b8b962e08008e5193d50256f9d8ca54f55799713d6ca8467caf6caf53afa1b10f9ca523205e3e23fc7b439050e71a0066a898cd1151598f5e4c12bec7af6b159986dbe84ea2563e177f90f816c19d19ece3ebdd5ef89961e7b9713cce9d66f33ecc7c86bfdf22afb28a0182b6d1d0430eef461c20a2aaa241ce7100ff9a5d7a59d31e675251b0931f407cd7d3b4fb166cb8bd09e3a68845cbc9071a23151687b0794ba8a07428795d20c33a51d1e06de138885410b1c834d02a0a20c19e61b2eb6a5d4e1c334c0925a417d0da00c3c9251a95f88f241218b3a3b52e9ecfe031dfb7c62418b2915c2bb5d08c21e3935e83617a50429eb2c5efdf00514e7778e43d1a93ce8895de8abb088f5c4bd2e90587380b72b32c75bf32a10d1a558a976f598382a696d3b45baab110d9eb8b4dff67600e00aa8113b9ec0538c8a507ca0d36028d45b32ce7ab2ca6a8371c711b92b03fc4a1619a913eca120fe81416bd2a8ad67ee574ed7dfeb2c407cdec5fc286cf6d9b241b9f28f42d4ee7c4ccebda60092918fc5e1302ef14f818df625409c9c1ef74e878694c1f29b393cb91d654fb3438999fd6eab84c841c4608e9944e61e4ebda7ca5fd2682916f065c6e937d952d87474847ae7c7adab8a463ac2d0ad894881992b90a343ba4d2ca93c7c970cacf243e8c4d72ddf2b42f0d", 4, - "cf7baf3beb19b125ce001f992f6a669e3e6f3c1426ac2d670cdb57a1c403cf5b65bd6a939cdee21cce293d94505ea30b7828f77a90f659915676dad107d1deca01cf756174883a7c52c14726ce8730b6b46ac6877864c55d15c092f7653f0102cfe127bb55f78ac87b0ba94c074a406a08b0bcc897ca5f00cbdc971b53ce704a924268cd4b8ee5d83ee2d9a2205dd901f3eff15bd7e1423da14e403cf950250d4c25dc2d3afd3595531cfc3057dda7f90cd6314f07814ae1f13e8e8ad4eae208e0c21ac198841d5401b88c08330fca019d81ba04139c47ebdfe2c945fe791a74a8a298dd5cb9b5dbb4f83680d78f9e070caad15878a1e472cd912c262f1aa78b5bb6f912602c0cb04b20450a74e1d4bf555b49e901b7acc86b6b87406393f903b8bc3c520a28783cfe9c79b496a7ae25af34e74672cd350bfdb5b5a9f46cb512bc0aa5f8c7dc125cccfa291069b44f15bad29e3e2efa2ff1792633f05f345f1b9066a3f9f67d90001140cc320ae80588ecb0b3eb60c6fb3dc9b434d0bfbed102afb2ee44b999c596699e19df082b6aa5aff6e1d63428a6f48c6a8217a970cae2d8438505b94243215649cf42ebc0d507079603121a5e817d026435752be29e7826e2116bbe046d6d620e9b5ca859761ecde89a1c7f01626fa0e4041e7c6a7e040e843021611332949d27d9cec02ff2b250ddee34cf583e98c45a246d289ab19a55023078a25dec107f055adaebf917046c3945631217d27b5feb6effc011e5093835c235766ac77f9e17b28cd628e062493024247dde36ed30fc71f97d0ead0d", + "cc8d4803307dfab93b6389de099708118bfd8ee95314558d6967aa377952fea441d4c60ade51a2421ee03b1d71d0ba0c348de4ab87cc218736462e1e9fe11da41cd76122bcb87e824b49c2f0e61be7b5f79556e52bb87b29bf11f28e4d40f00ce944d7179afbf4706fbd5ddb212f6c43814f47cd04483c446c2f47adecf6e900832b99001b18014cf0612278ca7bf10a65f2def4f1d7c170433484b5994b838f4b469cf6f746c77bc360f0cdf6758ce10e3c861079529f742386ef8fac5ca903fa52618ca0d13434dc7e9cf90f5fa773fbec016d217c9e68c9f05e3124e9cd67c2cbdfc29870524dc2988fe1d75f20077260cdc3f7a5d224181c30e7d17b2f96c83badaa625b9ab080756fd7153c4ed0c991fde00b7e2ce6e2fc9fab65c6fc0819e4f7232daf87b6d702d5eab3710efb0c9edf7477f05a2f2fecdb7bee800a32dd11fd4870bc75a94167b13ee446701146f791ccd657a242df189c41ebf1c001f3052edaf66faa93b86526c267b4f77f020e9f5ca7748809d69798c3261a1a02c02f150ab905fabf0797392ea83228ff62a0648e90187a46704586a5c4d3525e64e60cb650c535078e7424d7ee8e690c6c40b01b753b5ca51664df4c2609ad01d2e0b9f1d5a7b862f1dbff57881f5d6939c88df4e454142ac8bdcb89d1f91d0d50433e1725506c537cb2f1bda8cd4a88fe6ee196ca5038927c2f45016ec4e3f07186ebcb0ac3258bee34d869179cd7062757c2fbdedbb0112c8ebcd3f85e4aad8c750b75c462be8123eed0423eb6f995de327d262c0c91cb60bf1359ff32fc00", return_code::success }, { - "0d4b4e3c9ac607be0765f747a2120ef024302483a8b8e85923bf02ee61e1add2c1e9bafe998b4bc96a94679bc59be100e965ef2569abdd63ae9e1048ee3fcc18cdedc82fe29b963765490885a1dff567468c17d3ec0d764c5f3c5e8aeff9c501010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab8382a94b79513a12e2c32355092e2459d5dd4ed1add96999eac8b01807f71869dfa0241162df48a5e27b817063db09a85d39713d77ca8b3e2e31e5bde3d01b4e60d0a1fe6f3c8a34ddc352f020367122417b8b5d51adaded5fac0a8c811410010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e876d70b27c073ef9b5e96dab271381a8389c76fc952597b0487cc9770ef24bfeaf9c24c56063cde22401c25460531130e8844a053fe29fa5193d7e29d28c1a36f0c28cb30f9c4b66ab1a897cf9dbe1ee95ec38ac703878e7290aaf7777c1a0e010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c972a0f98fbfe7a8388a9c540d9c4e995bb01f544655e544b352cca1be6ec12d72fed8d48282ea5097db260a54b1a30daf1a03f8505c4bd0b5d146525570f6936f6cb79085fcbc691fda7482f7fc5eb2d66c6621344fa164647575f4de665818010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "e4754d08ccee74a9caa97207df25d9ab389cf419edca9f09824d96a41eff4bddbfca8501a9b88f349f732c4689255f0d8c080aed63f33ca3e584abfffb9da0cb066f2fdbb55b1a74486ca8ac1d2743e0e5e4a1e2d3e7fc2f06b8519b2903711143bc4f83c4d492b69d9717667eb90d195550608509068f2df97a2100a380642d20166c5ea2eaf9cd2a3137ccd9beda13d3eaa6fc235ff83bc54d1b28ae2822e0f07d600bf7d670558cf42459377dd91593f5d2bf6c0ab9f0b445749cf3822c15010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000db6d4bb841ca516a01e631aa9d583d1b086cabe53c5ba89b07818d74a2bbebc613dc711a12e7469274291ba8d74eff1699b07b6022d428c10b0d99a2b4cc68b73b8998e21319e7db981d35b9ea5cb5339d6c324c659f02501f5fc1d373750f0d7e5c6bae1659a142fefb2ab51cff11b56cc055ad49288f0f224d64d45f03ec98c514fc58fcdd124c420c5dd6d170bf1927ea611da29ce1b634fc1e5923c3b187d8b102cef09d9f3b6dc178778bdc1a73e0aab16f87717608ca46f3c44f48830a0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007a467036d6400b4f875e8c2a2635bbd3e49edbe95007184238205550acfffe1745e38dce7df8f10d790cdb6d0877cf071ead2b5581c7f58bff436ee1dbcf34fc482f8a45b9b2e3198c8e8d67930d889a24b8a2c6bee1d1d81a2a9b3dfc10e50f2ac51f1178908d5a8520f0cc36df2bbba4a74d6868980d160b35da0ebe7d4dca4c75655fb77ae3dd37680405af9f460c490d591876bc42dfe6d431bdba52f5a5376cc85c1f1bdf10cc30c78fdee777cf802a1a364810d91a40f18ee74df1260e0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c70ff37f672c48417e54ec20922b56de3a0911129f1a834d940cb8dca8829141dcd4c7dcd054f193a181c01b24ddc0af3474d1163b2478de2c7fb3824161d0ea29fd57a2b8bde34aa2417ac84176824a0490208585b9c5a678da865f17b56106576d239c5ec25b93114ddf0a91241093cd3ab8cea9f700517f657a18c3d505f17a15a2713551e8c578122c6dab61d19436094f7618e6976ea886b49710db5f40abcd0b4b4ca386e1e74b5900946ea0d62ef1912213b224c457eed8ce74ec80f010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "af7d28fa69e9ff7cf98da7614f02faf91f8ae2888d522db1a225724394bedd8547ae93cb07b41f5f21092846c6c2950e43328c2e6aaa18cf735a703f4ee43a60658167b9c1bf895ddbc898dae5269a335699c595aa9dc4137103d5480320270f756a4c35700b847a02d4933be43e508139affb438b7bcf547debcf9904f1056d197ec8484283e2f194430e16443d250f0b4734d5380cac631d6287e2b45a6a12fb5fea3eed96a7b2cd3bac9a532e4bb6176b1e792964444798e5bf151e14c314277fa052e05911619c457335e708633aca11239a33686e56dd949e6f50e5fe79f1d069bbb01822566f992299184ddc06d08c662a5d2b37668c7821bef5177ff4df977799dc81ae15d0444be9a54db2195d41e316f7ebdb7d879f8f7b355cb416137401a36684f0ccbce51fd4d8b32f45d81f2c33bc95687ed777e7fcb181367e163d94356c96d239f193dabf01616d13936ba746ed9a64578a5a4b191238fe8472e4135525afcac4ed818c13e518864ce82de26a6bb1066b9c0771c021716603", + "5528fc322669dcf2757583835b5ba5cc84f629db47e1d5e3ec78523fff567ec26100b7977ba038586c9e465abbaeb603554afef9cfe21ac33847b1d11796088cc6b18c7544355da3f996ddb0c0a15c8b1eeba2ec3a5cc8c7b4a8ecc7131e4609582cc42caa57f68017f95af50757bfc0d3c4d4327d1d40012af8f664da428f1984bf17c26d43b6fd65a8ce6c3d039d03f1247385a3f565108de722d4e08b0e9d23bba036646668167bdd41709ebe8bf5aadbd88ccc2af0c6d5940531c9fd50053e786ffe9011554db15fc7e130ea07cd254f21a86911fe758517274f96b89cb67e30c104186c4a6cb0d92cb82e39260245b68e74bdb828992697a1957be0564a9863f56eaf36bb5fc4d0869468b6ad4e36a1e7c550303c80c4ca0cbae773b309a61c6d4d6a4d2f17a4424c1987d294f195275581c8b8f88b7ce7fec5bc67e7bfd58bb747f39aa4dbc77d79cd18dd09142b10a45d49abc8fd544281f02a0e045062b72b25ead1a376e4f705ac83ad2385c84a8fd914d2f6a71d7eeb7126d677001013a0df759ff906a09fe4a3da307dd6cc17ee1fd72af8f7d953662be427cda2985cb1073563bbea492d9e6a96ca8a05ca5d45d349cb3e2f09cff6022a9916324eaa4fe5c543d46cafe5f82e81c5baddc2cc58100b03a20c2feaeed58cbd63019b8e3586d14193470d4ee9c1a0fc5e0a736e1ba94d7ad20ead3a3dacc4b2f3530ad751daffa944be4cb1969b3d2595058007d28d49e2fdebab68607c119b77d766785ed9e209582c737fce93b6ad0d4d795f86415238e0d3b70b9d8954d6a20ce85e7128588a849c505d5d2c81ff63bf12ea3ad52a316316ce49b2014dfbc486c9934dccb98db06089c03dc8f76ad70323ada12fe7e5b9f552c5b6cc073f72409a6e44f6634ca58bed30649b9840f177ea0039932f81574ea22b6da18b702f0e367f633e41d2b585d5166669f4c48d389f003eeecf06b5aa119d0df46de26adcb938d362e4410fdaa990a6fc4c2eca0f7bffee724789a0a47ba1b531bb4a3c95c129585ba5c9a6fe978a6915f4afedeb710ef6a55f153a5b21f943de6531680d", 4, - "286c55106bf4aadd45598d0d637e267bc5e94e8f550eb3e9b0d887f339dfe858925f0e804e781f2e0c04e897925f6d018bd6e5739eb2ad1a44f66eb306cf32b73a077f995da743a0c7a4dfca53f5dd9c70ef8a36a811ef1839690ea85a562d013d7ea5b85705fa3bc27fbc72b947d848b2ad9449cdd47413c97eecbcc657e79b0c883cd68734060273b1ecf2c747140c4d8d1aea519825589bf14af8c91af46f5219489dac184de82d87a466fe2d24d003916e4b0b6cd97a3b4c9aa4d93fa118c834ee64eda0d65578fb28afad20d6f0ba21d93ff2c027f1e8895646fec77e2bc63084a032f4a5cdf8c7b9d0e5abd80f850543f787be24559f93dede27f2a95e48f378c73a4d22d38e013a6fec2858e100f1b7290f17d82d88e21690a2454716454db66268274763175c8c38b1f864024a7e9e0c3c5564b16a7c90125844502acc28eecfddaa148a9502c2f10f506213fa07113ecf0e25e311625a97b4c3ed045d957d7f7a6dd886eb86f6b8bb73a6eec2790d4256b77405aac4056744215d06e4bc1e963f777865900a62c9f1794ed060dbf12c7caf6d377c6e6aacffb3cec18cdf0b3a3686f6be7193bb84da0e9306fce8497146c2520e9c3a1b0e0118558d096d07d967d6cfd1c1247e90fd734c8ee3b678003b9764b776df0717706fcf011866637e31a84866e091c16ab04f9be3d1c33e0c19e513de3054e0b69566c559c988a748f930a9067b8be8e5cf6ebf09fb20a210c411dcd69772e9c314bbcb2dc84f51a58043408f69a4082185c32f42486d72b00c672b96276e2fe7044e7307", + "01cc207c7c76c65afc059d073106d545705af7c4e4ed78e6169c599bae1c9bf6358d5a2cdfeeae389cc64436dfe7b7192c733fe9e2d105c0eaec21589d8bb5ecd5c71a5fee083af47a1cbc3af2df8a13603a78956c39f55fd0663ed482846a047280f87426ecde4c535c0d30bdf4b95ff5aff45782129ee6c7a0fa20a632bc98e95bfb663685eb2443e4b1f518c40f00502303b3db49be61f36ef6af46b9097c83835a864ae6337ef07e40df617af1aacea98c0d75e96a104d41a3617e7a4f05fc1cdcec57ea40a0237ff387a5d9130b34c92cb57a3450080bbaa2f6f9e895851b05c05eec03abd2d5083c81c402a500d2bec4895cf0f58a9953e43ee9039a38ae73cc3ec325fa636777e1f597b69a2b6a62bd49fba5b163bc03ce73f277f818fad1c6681fa59be891c2baf85b6a5e908d96b6a6c4cf3d53b3de23fdade91b3dde7199648aca0fce1d2307253bf57b054a4c4dc276034f8d57017cddc0a84975c643f9ea808652f2cefea32f767fe8e6df58a837c47c3136ced7107e7dbd9711399605212e6a1b8da806a12636076f7da0629ca8173f0411ba2a1050d1bca61994e28f69f274ec94e016a3ba6f9a6b06cd17f570928b5e4b8c75a5d62a0a67bd54249702923b440355db775599ea7be7cd3c6d88ab8da7694e43352837b0080814880a1460bc61fae141d36f961db8393313f74a65c3eabcc38793b84062999364bb0c36a415445ec4318b59c16e850260a53e7aaaf72bcaa568b57b69b552bf827c3e1c116565122322d6c26e14354fd96dc4bb1161ede0ee36efeeae1a5503", return_code::success }, //test (three invalid g1 and g2 points, should fail) { - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 3, "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", return_code::failure @@ -487,34 +487,34 @@ BOOST_AUTO_TEST_CASE( bls_testg1map ) { try { //test (valid field element) { "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "c4eeedff9d75fa9b8fd2dd02d763e6da336b8a0cd5c7164c5dffadb719735838b794b1ade1cd180b96c668208f8dfb00ecae7875aaca56ec495d92aa34bc52d9322bc310eea68f0c31d1af89a5d02a9c678c72e38737bdb773c7780d91f06205687481c64b51db898dae924db9c925889c3982512d6ed2fff5603695e0f02d95fbc6906a9eaeec6e073f9a39b318c206", + "15a40e7d0c871905db43ac11172e2f59acbc93fbd6f29750faf2d5454cfa732a37504ed19ade305c2d338f2b37a0a91133212273e76ea9ea9fdf2be2e8d42f3963cd476abce81651448cf5556b92ff40e28d78a34bc2519f71a06441990f2c09", return_code::success }, { "6de1c03023f2b4e454559b97266ebc1f96cd5510c4f48e2acafbe73a536a1477f2c8d1c9b5f6615d01968ea59ef4fd07", - "e0a482315373675926a671cf7b6713e386be3a0b9daff70aff0c00280d9cc89cb71b11348e1dc9287d0e0c8ba0ff880935d6d7f42bea93a3aeb042b25eb8032cea0398c21be52eeefca4e303e9851fb511358e1e2924a68cc82009b4114c8800ceb889478e18ab51d4c202caea0db6dec07103307e95b55fe40f02fd441bc64cd7a352daf77de4b8ee643c26bd941c13", + "2c7390d4bfbe0ccbaae9699aab5458d62f6d1aa91938b0ab0717249ad89209cb14ee8ed764a8952415382dbbfdef2312d5b2988b1ed7e6907d73ef2335cba7f9263b63003effa44ab8d6805d6ed0f08d87919230f0cb45d9ec35b2e0615d920f", return_code::success }, { "d2e51018d97c13b16f9ad81abb6197f8368434b501c6f8b2d690fef722d806f49cb469d61f4bed69a124f8db3aab7512", - "2e324e790bf2eaed08c841facb268ad531db92785f8673478dff9943691d87eefbb2dea440106ba077903accdb0636033cfeec3c71157ec44b48db4d02ed7a027c705425f2ca27e9ecbb4ae71d019c841c90b616fce8ce93f96ba488a1f0be088014a79ae95bfcb2321d7c164bc8bae45c69703ad22eb90446841b5a7b64221d72c66a3be502380e6113fb79b73a2a14", + "d60fcadcf09a0903da1740403626c463e7b6bafd4d94e3b12494fab1b1dd0688823ffba1ce06ad3aa41dfbb4d03f9d17e483b41a9025fb46aae72abadd4a1f4c7b9fa66fb3b699cdcf20683c4de67f3dbef1231d062bf2f5c095d4c6b17c030d", return_code::success }, { "094956e84809a27f467de542a0149629866eb5b9ec353e267b0bef3e0836effe055c6f85278857b8846dde301dd1930e", - "9f97704a2c4f6b91a6b54d10dbde430d68ab991136d825fa637757fbac7fb3a6c957e22bb33fde456ff0173c5e37530c04da881b4cab754d3635628d8897b1eb0edfa4f42f96e8f9d9508de9c8e4e84997f49e00dd5e1714e2acaeb51e0d9110ab5a6e6aa0dfe302b69e8d98e340e41bd5b4ffe001104bd7cf70fb9f7166fdcf0b4a9159add28f694124bcaca527f817", + "af04301d928149db56084cd0e2a21706fb8d78010b3d688cb6a7fa3a7386b6f8da49bab1e894b69d20d1de7ec766aa1588b7a8aaea80423a3e13d2227ab7c5514e8a3a5960e8af86e85e65473d408532da4cd7790add01d2d19d73612fbb5209", return_code::success }, { "3a1acb866b91c2cb46858c70509b9789363b34479bbd65e216c9d91c52512a63464decd8e60bd27470d1551148415a01", - "210606d6d1c43825ed042049b2e194cf699c5846a29693a1bb9aab1cfd75561e2a76c29b16d2b4f5d19d9dbfb128ee17e33ffe21e4c8c8be42bb756daacf8d5b1bb0c9491c417791b22e76ff8b70a3f4593de13a60dc89e33726fd5f4885c3170fb43004347c5be08adf622325a7251d9f0f1159769ebec8a0db1a6df5d95c166be6d7d8c112ce6d64457ddb4ce6bf16", + "ee8704a8d29554a7234c8599938d46fade4595adba6903465faa302949622e4273f49abd84dae83579836e10e58c3206ca0bfd27c67241775f1d307e6074a5303b33991f13f4a8c864717ace864b31f1a3987496005a3b434724553efefd4b09", return_code::success }, //test (invalid field element, should fail) { "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", return_code::failure }, }; @@ -556,33 +556,33 @@ BOOST_AUTO_TEST_CASE( bls_testg2map ) { try { //test (valid field element) { "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "2cc320eb83394cab86cfcb2aca98ee59c89adc82a2ffe8c4fcd240bc065aa174a5beb4712d6858743395b9ca92403419dffd1c5ba35a4adcb76ce228e7b3811c79f7c7176a9bd2bebf0b69a2f6748e0026a111265c5f41f86ff25aa9c4603207d4fa8db63db7c467ac4b745e4772b2126cbf2b8b39d1e86f48b4226cd6e858ca41e9683208831680f4c541b8d69810138c08a55c4de86d52e6c81cb10a89c8a09076792a4e923f0642600b11f3d66359100cffacb11cc67db3c1aeeb0dfc98143aaac9a85894082ac034829392dfc109df5a4e5e60834a2b77b4b137f33987cb2144463019d81245b08de156352b8a13c25e15d1288382ba2ec9832dcc21ba0ea56f6d2864ee902ccaa4b363edf438326aaef5d934d81f86c2dc2581b0eaa111", + "cebf24b3a427ffb720bdd7a6db5d078bf161cd790cec449d9b1dd32dd013f466e29cc28d8419e6d5f9eec96e89208301928865ac51d20bb4d44daec3277a8a42fa6fe995fa25706db09fe33db90d41237efaebb3862e2db05ba3b51821d1670a4159c35b8671620078d842a0c743b14f6034d3a00651f55df8e6cb9038d1ca95b8d2ba46326b2521c3a2d14436e060025cdfaa769a6e8030aebdee3c9a26c627ae764f9b196d26707fac12617c0e4ecf183fe605589d6707da0b3fa47797c604", return_code::success }, { "1449dbb73bbcb48b3b752e02dfa0edb5ede9419d8b601d3caf6d4298447b1db2fad35b44e4203eb885f3ad27785d770eca5e3e2d0530cf2d49254ead13700b8277167500205e7f30efce24ae70d4b1fb160aa7ca820ce7b767a21b7107bc5f02", - "e84dd939150d71b3b43d46434f7f1f77a0e0c61c8110ed5cffd98289f2d81146d8d59f0e9b16dcb774d9cd65ffd81b00992d503294aaef09fdd3af0daf143d3bbb0032606e07655fbb5f460ae0e46883b008c7227174609201df62fbaf8ba207df50029d418e33954690de92c5b8ac306523a11e782d2c55678b787fae3d52f286aed0fd5ffa083fc5e1d1a1ac704908b8eaa5c7ed9a5b3d6434932a5804cf9903d09f0b1fdfc7d730a1421d3231f505205e4bbd65e73140205767a1cf3ef719a3913387a3e9ea4402fb28036d44884bd7404fcf4f939a2a12191ecc910682a4b86624fd1c77958de393800e81c757190f96bb7123c76a549b6df5a035feb584164e88031d89451516f9b4a085e71cd91b442e72d8bfee79b61f36f3363c3309", + "4d9e217a0f270f7b3857dade18b09df0ac351a80a32e9317d58c730cfdf2681e37c763c4ae047ef0f9470bdafa4b7e02b89873bfd72bd20a5e9a64d6c191db420f002d04c951f7715a7e44b154c8ecd133220028a93cfa9d9fbfec7bb733430da73dd04ed8249a290af8e2f7877127c09382737d1206b023f17eab887fe27dc4e62473b3ed8f21dc6d51efa9cb743605db76e8502a1adf2b1cc72e8a5499084e7ef4cc166727fcd9e8846874b6af1f7b0a7af30410a4027e440dea77c76dc70c", return_code::success }, { "db4f64b6ead6e1a545fc454e24f0ee0cc9335ee6ee1b8eb70550c8d32312cd663a064fb651284b7cbaa8b5e41cb35a04cbbd1c96af164e0a97ce331daacd180ff7d3308d364aa956799902525dbf4180590fb246355a0174eb1d2afddba77018", - "cfbdbf3b9a0ba68429054cad7effe4343d9d559e2c8433515b54f59442ade90df79c19280b0e9268a8a3d7221f6df606ce984a0737b381d10af7af93cc231de97ed6de5ba4a3e42f3d6ddd997a0e989db4e3a945bd19ef7ba0e2da377ddef40eb2f45ce6da09cfc2af45d299e368d4ba819d10f98a3275bb2438a733f4050cba51770b4fbc4b9124595d318e3042850e31228e8d3e09cbe9340a4837311f4a788c8f74c354096f195a19555d7fa6329b04bad93126fdd3b94874bf7993495809df0b7da1214ea8807b3911e1aca7f1f2158153d04386f3d47d47df7dcb1b4b1a8915f125936a64a009f3a6c0070e81167c30f706c396c5eb6eb86120d4e8ea3c961016afa082c18ed86ff426d193755c7e3ab39735911a93b2c015619319e510", + "7bf905347dcb42821d7deb674a9fc052835f12dba6b04fcd7ac581160ac31c45435354385ad4dc8954e5b2b51c9f34097827945d3c30a398927583560ba680f70dc872012cd034370cb5c2c1824e5292c53485f4ba5d9156c067af407bf8f01811b89684098a5e9914b5247a6a1f612b9885c8613ba4c1439577397d9d2742ea83fdf00b23b8f5122574c7b2ded9f202c0631f446ee9afaa967fc4da3bd02b3ac59207ab71b452d62bd37b06abca7ae19bf36ece41797b94ab89c61b34baa210", return_code::success }, { "b4108d552274d175fd4e52dd766ff396a4f365c102e0ef7b4d266f220ec67eefab48ac15d1db0d98ba31cda435616e0bdeb51952b044ce0f64b5d42199d9560ed0175f3d2c58af07909d29db4480c1b417dfbf7f1af274648adb54b029e38f08", - "5fb1388da7918ccd909f866d15e0211a82048237e02d977f20543ac40ac93de2ccff2211ea443aefd839a5b1e9518b0eb8e639157aaff319ef48a1b47d764b10711615230dffc2c6740b382a0ef25a751ec8fd98d2f44161bbe10f0fae62cd1962caf7d08ca08638403fc28094e46143a23aff4238cfbe85a893fd5cf339fbf241880136dfe3160e74faf6349dee7106ba97a567e770f6ef6e3ee2571d958ea7ce323506808d015d3d1fa22b41027fc57b247a89bbf85e87bc4bab5fd78fc103844e484f2c5cf3ebf62015b6d4390058a017c5cd072240acbaf0d962da5beefd9b574359427071ded658cfa878defd14fc42998afa44557c7370903ed6b34513790e586950c1488155a4fa162462ca098e4016c3c403ba386d0d8d2435e44014", + "f74a6a357dc6a1fb33344f60898ab9eb29c68170727136b26d943249fbbd9393bd893846ea0d43250d4fd37737e49f1463d11827561e80cda0f6ead2cd3c84d4be6d99d61fa4cbc41cce534af2cf3d1b3fc31ccecc1259cfc7530a93c58e801951454f38f693d2d763e0f993c202151d873eefec3e90507cea6232cb3c0061f254a2f4b5872098b23362763a79d6c004333e0e02ad077c8a3683d63827becf20c88a9b7a63bbac739bc3a4f659d119df2f5853e371a25c803fc8301c393e7804", return_code::success }, { "7e4dda81ee149d8b6b43a1a89c6f80d07b5fa93bff73215bd3c8677c671348b477a8912deba95a298574d64706b5450fb6fb07b9be96d4b87d677eeab47bc473ad7dc44c286b9e63b949ac64fb5b56e09638f48847238c18c1e4056aa616df03", - "0747e844852618f18f528be3267dc11c728c2b0b7f6fddfc240971949c5903147cdb2e5791851f792c5822237793921053736a50d7719c2421dd58ae2c26aed85f8330123c395b6e18dd760327240b875de65237c33e341afc5b877398e81518cd827ebcfd2083756ef1e4150d8276bbc2025c8c01bcff1fc24f57090a34211d62d50b7d5df29a3eeaadb10d0db91919cb03f8fde38e858599d3e3a01670a1ac4d11f9b2eeaa3d109e4fac1e9707f420fe34bb97efd94ad874150b9a5f512719e2bfcb1784b834b17f33552846bf6f8edb4817764a9fede0f29806484f0270ec612752f967a095bd94137d0402384900d40f85d23b50c35994ff0b7268e89f207cb9fcc786d944e522571ec86b621bb96cea8fd6519c623c54a210c23ad66400", + "5255e92a8a5338d96668c82f7303900657c50e4e4eed48a79808d7bed8321fa27c2db96a79d1d79a667484bf2c1504083ac69f5e8625b05e1b5a16513a98b119eb297ba5474ebe89b7fa0498ebc787a0a6134626b62e3770784886c894008e0b3abe627685e82eec72618f1e10afa131defa621dc57eb6d95ab25f251600776791f1f34afe032cd31a28d72d24c8e509493406a4e3f38b15bbf3f648ad03d1d1a2232db91a781fc109e8dd9d8d4e5bf76639883c0cb06b93a315ce8e060fc814", return_code::success }, //test (invalid field element, should fail) { "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", return_code::failure }, }; @@ -624,7 +624,7 @@ BOOST_AUTO_TEST_CASE( bls_empty ) { try { ("points", std::vector()) ("scalars", std::vector()) ("num", 0) - ("res", hex2bin("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")) + ("res", hex2bin("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")) ("expected_error", (int32_t)return_code::success) ); @@ -633,7 +633,7 @@ BOOST_AUTO_TEST_CASE( bls_empty ) { try { ("points", std::vector()) ("scalars", std::vector()) ("num", 0) - ("res", hex2bin("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")) + ("res", hex2bin("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")) ("expected_error", (int32_t)return_code::success) ); diff --git a/unittests/test-contracts/bls_primitives_test/bls_primitives_test.hpp b/unittests/test-contracts/bls_primitives_test/bls_primitives_test.hpp index 5ca936225a..78999625dd 100644 --- a/unittests/test-contracts/bls_primitives_test/bls_primitives_test.hpp +++ b/unittests/test-contracts/bls_primitives_test/bls_primitives_test.hpp @@ -5,8 +5,8 @@ using bls_scalar = uint8_t[32]; using bls_fp = uint8_t[48]; using bls_fp2 = bls_fp[2]; -using bls_g1 = uint8_t[144]; -using bls_g2 = uint8_t[288]; +using bls_g1 = uint8_t[96]; +using bls_g2 = uint8_t[192]; using bls_gt = uint8_t[576]; namespace eosio { diff --git a/unittests/test-contracts/bls_primitives_test/bls_primitives_test.wasm b/unittests/test-contracts/bls_primitives_test/bls_primitives_test.wasm index 037e98a7c6646783ef986d238283d3b0d478bff4..d3bf5ab64c0bcd321cb846ce5214a7b98ccd33fe 100755 GIT binary patch delta 373 zcmZutEl&eM5Z#$xFTiEFT`nX|D9I%tE?^M2Lc$6Nln;M@0MS(9sYD>I%pYiQVA$po z^hzWILr{kRji~{{?rk6ys5i-*_c1fcCYinuPy>xQ(P8tnQ?ay>VX7ReN7l20V0)Y? zrfv)q5aEs|+?sIg;%?2p82Xf(l!i;7%dId&DCkXe>25|Z8}OzMYf}RPz3G=B87BZ# z%;uuN-YSb;8xWkYFr}d!^KEEVtY6F1KsC?O;I9{*L~X1X^`ku2Fs=Me?$YJlZOg!a zdIPk^+h}2*=TMZ_{0R6|lqJ6Bhd6StIiPiUm2B8#<3AGm@)z_Z6IWp5Nx>0BJ6>SO0x|>`+;|xr85~z0U=U#B zW^#Z?fRqVFS%FQO@xf*rHVr1m50f7XcuiiOM&|g>#UBEPX0%xSa2c|3)2JTzTj4bua42};NH*e&%Wt5n}m;*LUfyI%vM1ckF z%E^A*GE5T~C+BcS@;_ii)(LZm*W@0qRT2xBu;~X{sl_Y91f)E8BN;zzUc~Fe$ctnZ zP~tb=M5YU%fbyKIEjUTo0BG|8NcgZpywWlGqM$Iy2@?ez`7eN-aG43}cwkUG1(|+A R5NydaK}TRHX$bi;0Ra7AXu$vg From 4e40590d6625573b5a6e00707b986b5714a9dee3 Mon Sep 17 00:00:00 2001 From: yarkin Date: Tue, 14 Nov 2023 22:14:41 +0800 Subject: [PATCH 08/24] Fix benchmark --- benchmark/bls.cpp | 110 +++++++++++++++++++++++----------------------- 1 file changed, 55 insertions(+), 55 deletions(-) diff --git a/benchmark/bls.cpp b/benchmark/bls.cpp index e5b5ad3843..fe03a66ccb 100644 --- a/benchmark/bls.cpp +++ b/benchmark/bls.cpp @@ -111,26 +111,26 @@ std::array random_scalar() bls12_381::g1 random_g1() { std::array k = random_scalar(); - return bls12_381::g1::one().mulScalar(k); + return bls12_381::g1::one().scale(k); } // utilility to create a random g2 bls12_381::g2 random_g2() { std::array k = random_scalar(); - return bls12_381::g2::one().mulScalar(k); + return bls12_381::g2::one().scale(k); } // bls_g1_add benchmarking void benchmark_bls_g1_add() { // prepare g1 operand in Jacobian LE format g1 p = random_g1(); - std::vector buf(144); - p.toJacobianBytesLE(std::span((uint8_t*)buf.data(), 144), true); + std::vector buf(96); + p.toAffineBytesLE(std::span((uint8_t*)buf.data(), 96), true); eosio::chain::span op1(buf.data(), buf.size()); // prepare result operand - std::vector result_buf(144); + std::vector result_buf(96); eosio::chain::span result(result_buf.data(), result_buf.size()); // set up bls_g1_add to be benchmarked @@ -146,12 +146,12 @@ void benchmark_bls_g1_add() { void benchmark_bls_g2_add() { // prepare g2 operand in Jacobian LE format g2 p = random_g2(); - std::vector buf(288); - p.toJacobianBytesLE(std::span((uint8_t*)buf.data(), 288), true); + std::vector buf(192); + p.toAffineBytesLE(std::span((uint8_t*)buf.data(), 192), true); eosio::chain::span op(buf.data(), buf.size()); // prepare result operand - std::vector result_buf(288); + std::vector result_buf(192); eosio::chain::span result(result_buf.data(), result_buf.size()); // set up bls_g2_add to be benchmarked @@ -162,13 +162,13 @@ void benchmark_bls_g2_add() { benchmarking("bls_g2_add", benchmarked_func); } - +/* // bls_g1_mul benchmarking void benchmark_bls_g1_mul() { // prepare g1 operand g1 p = random_g1(); - std::vector buf(144); - p.toJacobianBytesLE(std::span((uint8_t*)buf.data(), 144), true); + std::vector buf(96); + p.toAffineBytesLE(std::span((uint8_t*)buf.data(), 96), true); eosio::chain::span point(buf.data(), buf.size()); // prepare scalar operand @@ -178,7 +178,7 @@ void benchmark_bls_g1_mul() { eosio::chain::span scalar(scalar_buf.data(), scalar_buf.size()); // prepare result operand - std::vector result_buf(144); + std::vector result_buf(96); eosio::chain::span result(result_buf.data(), result_buf.size()); // set up bls_g1_mul to be benchmarked @@ -193,8 +193,8 @@ void benchmark_bls_g1_mul() { // bls_g2_mul benchmarking void benchmark_bls_g2_mul() { g2 p = random_g2(); - std::vector buf(288); - p.toJacobianBytesLE(std::span((uint8_t*)buf.data(), 288), true); + std::vector buf(192); + p.toAffineBytesLE(std::span((uint8_t*)buf.data(), 192), true); eosio::chain::span point(buf.data(), buf.size()); // prepare scalar operand @@ -204,7 +204,7 @@ void benchmark_bls_g2_mul() { eosio::chain::span scalar(scalar_buf.data(), scalar_buf.size()); // prepare result operand - std::vector result_buf(288); + std::vector result_buf(192); eosio::chain::span result(result_buf.data(), result_buf.size()); // set up bls_g2_mul to be benchmarked @@ -215,14 +215,14 @@ void benchmark_bls_g2_mul() { benchmarking("bls_g2_mul", benchmarked_func); } - -// bls_g1_exp benchmarking utility -void benchmark_bls_g1_exp(std::string test_name, uint32_t num_points) { +*/ +// bls_g1_weighted_sum benchmarking utility +void benchmark_bls_g1_weighted_sum(std::string test_name, uint32_t num_points) { // prepare g1 points operand - std::vector g1_buf(144*num_points); + std::vector g1_buf(96*num_points); for (auto i=0u; i < num_points; ++i) { g1 p = random_g1(); - p.toJacobianBytesLE(std::span((uint8_t*)g1_buf.data() + i * 144, 144), true); + p.toAffineBytesLE(std::span((uint8_t*)g1_buf.data() + i * 96, 96), true); } chain::span g1_points(g1_buf.data(), g1_buf.size()); @@ -235,35 +235,35 @@ void benchmark_bls_g1_exp(std::string test_name, uint32_t num_points) { chain::span scalars(scalars_buf.data(), scalars_buf.size()); // prepare result operand - std::vector result_buf(144); + std::vector result_buf(96); eosio::chain::span result(result_buf.data(), result_buf.size()); - // set up bls_g1_exp to be benchmarked + // set up bls_g1_weighted_sum to be benchmarked interface_in_benchmark interface; auto benchmarked_func = [&]() { - interface.interface->bls_g1_exp(g1_points, scalars, num_points, result); + interface.interface->bls_g1_weighted_sum(g1_points, scalars, num_points, result); }; benchmarking(test_name, benchmarked_func); } -// bls_g1_exp benchmarking with 1 input point -void benchmark_bls_g1_exp_one_point() { - benchmark_bls_g1_exp("bls_g1_exp 1 point", 1); +// bls_g1_weighted_sum benchmarking with 1 input point +void benchmark_bls_g1_weighted_sum_one_point() { + benchmark_bls_g1_weighted_sum("bls_g1_weighted_sum 1 point", 1); } -// bls_g1_exp benchmarking with 3 input points -void benchmark_bls_g1_exp_three_point() { - benchmark_bls_g1_exp("bls_g1_exp 3 points", 3); +// bls_g1_weighted_sum benchmarking with 3 input points +void benchmark_bls_g1_weighted_sum_three_point() { + benchmark_bls_g1_weighted_sum("bls_g1_weighted_sum 3 points", 3); } -// bls_g2_exp benchmarking utility -void benchmark_bls_g2_exp(std::string test_name, uint32_t num_points) { +// bls_g2_weighted_sum benchmarking utility +void benchmark_bls_g2_weighted_sum(std::string test_name, uint32_t num_points) { // prepare g2 points operand - std::vector g2_buf(288*num_points); + std::vector g2_buf(192*num_points); for (auto i=0u; i < num_points; ++i) { g2 p = random_g2(); - p.toJacobianBytesLE(std::span((uint8_t*)g2_buf.data() + i * 288, 288), true); + p.toAffineBytesLE(std::span((uint8_t*)g2_buf.data() + i * 192, 192), true); } eosio::chain::span g2_points(g2_buf.data(), g2_buf.size()); @@ -276,44 +276,44 @@ void benchmark_bls_g2_exp(std::string test_name, uint32_t num_points) { eosio::chain::span scalars(scalars_buf.data(), scalars_buf.size()); // prepare result operand - std::vector result_buf(288); + std::vector result_buf(192); eosio::chain::span result(result_buf.data(), result_buf.size()); - // set up bls_g2_exp to be benchmarked + // set up bls_g2_weighted_sum to be benchmarked interface_in_benchmark interface; auto benchmarked_func = [&]() { - interface.interface->bls_g2_exp(g2_points, scalars, num_points, result); + interface.interface->bls_g2_weighted_sum(g2_points, scalars, num_points, result); }; benchmarking(test_name, benchmarked_func); } -// bls_g2_exp benchmarking with 1 input point -void benchmark_bls_g2_exp_one_point() { - benchmark_bls_g2_exp("bls_g2_exp 1 point", 1); +// bls_g2_weighted_sum benchmarking with 1 input point +void benchmark_bls_g2_weighted_sum_one_point() { + benchmark_bls_g2_weighted_sum("bls_g2_weighted_sum 1 point", 1); } -// bls_g2_exp benchmarking with 3 input points -void benchmark_bls_g2_exp_three_point() { - benchmark_bls_g2_exp("bls_g2_exp 3 points", 3); +// bls_g2_weighted_sum benchmarking with 3 input points +void benchmark_bls_g2_weighted_sum_three_point() { + benchmark_bls_g2_weighted_sum("bls_g2_weighted_sum 3 points", 3); } // bls_pairing benchmarking utility void benchmark_bls_pairing(std::string test_name, uint32_t num_pairs) { // prepare g1 operand - std::vector g1_buf(144*num_pairs); - //g1_buf.reserve(144*num_pairs); + std::vector g1_buf(96*num_pairs); + //g1_buf.reserve(96*num_pairs); for (auto i=0u; i < num_pairs; ++i) { g1 p = random_g1(); - p.toJacobianBytesLE(std::span((uint8_t*)g1_buf.data() + i * 144, 144), true); + p.toAffineBytesLE(std::span((uint8_t*)g1_buf.data() + i * 96, 96), true); } eosio::chain::span g1_points(g1_buf.data(), g1_buf.size()); // prepare g2 operand - std::vector g2_buf(288*num_pairs); + std::vector g2_buf(192*num_pairs); for (auto i=0u; i < num_pairs; ++i) { g2 p2 = random_g2(); - p2.toJacobianBytesLE(std::span((uint8_t*)g2_buf.data() + i * 288, (288)), true); + p2.toAffineBytesLE(std::span((uint8_t*)g2_buf.data() + i * 192, (192)), true); } eosio::chain::span g2_points(g2_buf.data(), g2_buf.size()); @@ -347,7 +347,7 @@ void benchmark_bls_g1_map() { eosio::chain::span e((char*)e_buf.data(), e_buf.size()); // prepare result operand - std::vector result_buf(144); + std::vector result_buf(96); eosio::chain::span result(result_buf.data(), result_buf.size()); // set up bls_g1_map to be benchmarked @@ -366,7 +366,7 @@ void benchmark_bls_g2_map() { eosio::chain::span e((char*)e_buf.data(), e_buf.size()); // prepare result operand - std::vector result_buf(288); + std::vector result_buf(192); eosio::chain::span result(result_buf.data(), result_buf.size()); // set up bls_g2_map to be benchmarked @@ -406,14 +406,14 @@ void benchmark_bls_fp_mod() { void bls_benchmarking() { benchmark_bls_g1_add(); benchmark_bls_g2_add(); - benchmark_bls_g1_mul(); - benchmark_bls_g2_mul(); + // benchmark_bls_g1_mul(); + // benchmark_bls_g2_mul(); benchmark_bls_pairing_one_pair(); benchmark_bls_pairing_three_pair(); - benchmark_bls_g1_exp_one_point(); - benchmark_bls_g1_exp_three_point(); - benchmark_bls_g2_exp_one_point(); - benchmark_bls_g2_exp_three_point(); + benchmark_bls_g1_weighted_sum_one_point(); + benchmark_bls_g1_weighted_sum_three_point(); + benchmark_bls_g2_weighted_sum_one_point(); + benchmark_bls_g2_weighted_sum_three_point(); benchmark_bls_g1_map(); benchmark_bls_g2_map(); benchmark_bls_fp_mod(); From 2a85796cd98c34198a8cf37c0acc164652cb67aa Mon Sep 17 00:00:00 2001 From: Lin Huang Date: Tue, 14 Nov 2023 20:43:51 -0500 Subject: [PATCH 09/24] add benchmarking for Montgomery form host functions --- benchmark/benchmark.cpp | 2 +- benchmark/bls.cpp | 435 ++++++++++++++++++++++++++++++---------- 2 files changed, 331 insertions(+), 106 deletions(-) diff --git a/benchmark/benchmark.cpp b/benchmark/benchmark.cpp index 5c142c4162..a8ede0f68f 100644 --- a/benchmark/benchmark.cpp +++ b/benchmark/benchmark.cpp @@ -19,7 +19,7 @@ std::map> features { }; // values to control cout format -constexpr auto name_width = 28; +constexpr auto name_width = 40; constexpr auto runs_width = 5; constexpr auto time_width = 12; constexpr auto ns_width = 2; diff --git a/benchmark/bls.cpp b/benchmark/bls.cpp index fe03a66ccb..623ac1c281 100644 --- a/benchmark/bls.cpp +++ b/benchmark/bls.cpp @@ -107,6 +107,32 @@ std::array random_scalar() }; } +// utilility to create a random fp +fp random_fe() +{ + std::random_device rd; + std::mt19937_64 gen(rd()); + std::uniform_int_distribution dis; + + return fp({ + dis(gen) % 0xb9feffffffffaaab, + dis(gen) % 0x1eabfffeb153ffff, + dis(gen) % 0x6730d2a0f6b0f624, + dis(gen) % 0x64774b84f38512bf, + dis(gen) % 0x4b1ba7b6434bacd7, + dis(gen) % 0x1a0111ea397fe69a + }); +} + +// utilility to create a random fp2 +fp2 random_fe2() +{ + return fp2({ + random_fe(), + random_fe() + }); +} + // utilility to create a random g1 bls12_381::g1 random_g1() { @@ -122,11 +148,11 @@ bls12_381::g2 random_g2() } // bls_g1_add benchmarking -void benchmark_bls_g1_add() { +void benchmark_bls_g1_add_impl(std::string test_name, bool mont) { // prepare g1 operand in Jacobian LE format g1 p = random_g1(); std::vector buf(96); - p.toAffineBytesLE(std::span((uint8_t*)buf.data(), 96), true); + p.toAffineBytesLE(std::span((uint8_t*)buf.data(), 96), mont); eosio::chain::span op1(buf.data(), buf.size()); // prepare result operand @@ -135,19 +161,34 @@ void benchmark_bls_g1_add() { // set up bls_g1_add to be benchmarked interface_in_benchmark interface; - auto g1_add_func = [&]() { - interface.interface->bls_g1_add(op1, op1, result); - }; + std::function benchmarked_func {}; + if (mont) { + benchmarked_func = [&]() { + interface.interface->bls_g1_add_mont(op1, op1, result); + }; + } else { + benchmarked_func = [&]() { + interface.interface->bls_g1_add(op1, op1, result); + }; + } - benchmarking("bls_g1_add", g1_add_func); + benchmarking(test_name, benchmarked_func); +} + +void benchmark_bls_g1_add() { + benchmark_bls_g1_add_impl("bls_g1_add", false); +} + +void benchmark_bls_g1_add_mont() { + benchmark_bls_g1_add_impl("bls_g1_add_mont", true); } // bls_g2_add benchmarking -void benchmark_bls_g2_add() { +void benchmark_bls_g2_add_impl(std::string test_name, bool mont) { // prepare g2 operand in Jacobian LE format g2 p = random_g2(); std::vector buf(192); - p.toAffineBytesLE(std::span((uint8_t*)buf.data(), 192), true); + p.toAffineBytesLE(std::span((uint8_t*)buf.data(), 192), mont); eosio::chain::span op(buf.data(), buf.size()); // prepare result operand @@ -156,73 +197,35 @@ void benchmark_bls_g2_add() { // set up bls_g2_add to be benchmarked interface_in_benchmark interface; - auto benchmarked_func = [&]() { - interface.interface->bls_g2_add(op, op, result); - }; + std::function benchmarked_func {}; + if (mont) { + benchmarked_func = [&]() { + interface.interface->bls_g2_add_mont(op, op, result); + }; + } else { + benchmarked_func = [&]() { + interface.interface->bls_g2_add(op, op, result); + }; + } - benchmarking("bls_g2_add", benchmarked_func); + benchmarking(test_name, benchmarked_func); } -/* -// bls_g1_mul benchmarking -void benchmark_bls_g1_mul() { - // prepare g1 operand - g1 p = random_g1(); - std::vector buf(96); - p.toAffineBytesLE(std::span((uint8_t*)buf.data(), 96), true); - eosio::chain::span point(buf.data(), buf.size()); - // prepare scalar operand - std::array s = random_scalar(); - std::vector scalar_buf(32); - scalar::toBytesLE(s, std::span((uint8_t*)scalar_buf.data(), 32)); - eosio::chain::span scalar(scalar_buf.data(), scalar_buf.size()); - - // prepare result operand - std::vector result_buf(96); - eosio::chain::span result(result_buf.data(), result_buf.size()); - - // set up bls_g1_mul to be benchmarked - interface_in_benchmark interface; - auto benchmarked_func = [&]() { - interface.interface->bls_g1_mul(point, scalar, result); - }; - - benchmarking("bls_g1_mul", benchmarked_func); +void benchmark_bls_g2_add() { + benchmark_bls_g2_add_impl("bls_g2_add", false); } -// bls_g2_mul benchmarking -void benchmark_bls_g2_mul() { - g2 p = random_g2(); - std::vector buf(192); - p.toAffineBytesLE(std::span((uint8_t*)buf.data(), 192), true); - eosio::chain::span point(buf.data(), buf.size()); - - // prepare scalar operand - std::array s = random_scalar(); - std::vector scalar_buf(32); - scalar::toBytesLE(s, std::span((uint8_t*)scalar_buf.data(), 32)); - eosio::chain::span scalar(scalar_buf.data(), scalar_buf.size()); - - // prepare result operand - std::vector result_buf(192); - eosio::chain::span result(result_buf.data(), result_buf.size()); - - // set up bls_g2_mul to be benchmarked - interface_in_benchmark interface; - auto benchmarked_func = [&]() { - interface.interface->bls_g2_mul(point, scalar, result); - }; - - benchmarking("bls_g2_mul", benchmarked_func); +void benchmark_bls_g2_add_mont() { + benchmark_bls_g2_add_impl("bls_g2_add_mont", true); } -*/ + // bls_g1_weighted_sum benchmarking utility -void benchmark_bls_g1_weighted_sum(std::string test_name, uint32_t num_points) { +void benchmark_bls_g1_weighted_sum_impl(std::string test_name, uint32_t num_points, bool mont) { // prepare g1 points operand std::vector g1_buf(96*num_points); for (auto i=0u; i < num_points; ++i) { g1 p = random_g1(); - p.toAffineBytesLE(std::span((uint8_t*)g1_buf.data() + i * 96, 96), true); + p.toAffineBytesLE(std::span((uint8_t*)g1_buf.data() + i * 96, 96), mont); } chain::span g1_points(g1_buf.data(), g1_buf.size()); @@ -240,30 +243,57 @@ void benchmark_bls_g1_weighted_sum(std::string test_name, uint32_t num_points) { // set up bls_g1_weighted_sum to be benchmarked interface_in_benchmark interface; - auto benchmarked_func = [&]() { - interface.interface->bls_g1_weighted_sum(g1_points, scalars, num_points, result); - }; + std::function benchmarked_func {}; + if (mont) { + benchmarked_func = [&]() { + interface.interface->bls_g1_weighted_sum_mont(g1_points, scalars, num_points, result); + }; + } else { + benchmarked_func = [&]() { + interface.interface->bls_g1_weighted_sum(g1_points, scalars, num_points, result); + }; + } benchmarking(test_name, benchmarked_func); } // bls_g1_weighted_sum benchmarking with 1 input point void benchmark_bls_g1_weighted_sum_one_point() { - benchmark_bls_g1_weighted_sum("bls_g1_weighted_sum 1 point", 1); + benchmark_bls_g1_weighted_sum_impl("bls_g1_weighted_sum 1 point", 1, false); } // bls_g1_weighted_sum benchmarking with 3 input points void benchmark_bls_g1_weighted_sum_three_point() { - benchmark_bls_g1_weighted_sum("bls_g1_weighted_sum 3 points", 3); + benchmark_bls_g1_weighted_sum_impl("bls_g1_weighted_sum 3 points", 3, false); +} + +// bls_g1_weighted_sum benchmarking with 5 input points +void benchmark_bls_g1_weighted_sum_five_point() { + benchmark_bls_g1_weighted_sum_impl("bls_g1_weighted_sum 5 points", 5, false); +} + +// bls_g1_weighted_sum benchmarking with 1 input point +void benchmark_bls_g1_weighted_sum_mont_one_point() { + benchmark_bls_g1_weighted_sum_impl("bls_g1_weighted_sum_mont 1 point", 1, false); +} + +// bls_g1_weighted_sum_mont benchmarking with 3 input points +void benchmark_bls_g1_weighted_sum_mont_three_point() { + benchmark_bls_g1_weighted_sum_impl("bls_g1_weighted_sum_mont 3 points", 3, false); +} + +// bls_g1_weighted_sum_mont benchmarking with 5 input points +void benchmark_bls_g1_weighted_sum_mont_five_point() { + benchmark_bls_g1_weighted_sum_impl("bls_g1_weighted_sum_mont 5 points", 5, false); } // bls_g2_weighted_sum benchmarking utility -void benchmark_bls_g2_weighted_sum(std::string test_name, uint32_t num_points) { +void benchmark_bls_g2_weighted_sum_impl(std::string test_name, uint32_t num_points, bool mont) { // prepare g2 points operand std::vector g2_buf(192*num_points); for (auto i=0u; i < num_points; ++i) { g2 p = random_g2(); - p.toAffineBytesLE(std::span((uint8_t*)g2_buf.data() + i * 192, 192), true); + p.toAffineBytesLE(std::span((uint8_t*)g2_buf.data() + i * 192, 192), mont); } eosio::chain::span g2_points(g2_buf.data(), g2_buf.size()); @@ -281,31 +311,58 @@ void benchmark_bls_g2_weighted_sum(std::string test_name, uint32_t num_points) { // set up bls_g2_weighted_sum to be benchmarked interface_in_benchmark interface; - auto benchmarked_func = [&]() { - interface.interface->bls_g2_weighted_sum(g2_points, scalars, num_points, result); - }; + std::function benchmarked_func {}; + if (mont) { + benchmarked_func = [&]() { + interface.interface->bls_g2_weighted_sum_mont(g2_points, scalars, num_points, result); + }; + } else { + benchmarked_func = [&]() { + interface.interface->bls_g2_weighted_sum(g2_points, scalars, num_points, result); + }; + } benchmarking(test_name, benchmarked_func); } // bls_g2_weighted_sum benchmarking with 1 input point void benchmark_bls_g2_weighted_sum_one_point() { - benchmark_bls_g2_weighted_sum("bls_g2_weighted_sum 1 point", 1); + benchmark_bls_g2_weighted_sum_impl("bls_g2_weighted_sum 1 point", 1, false); } // bls_g2_weighted_sum benchmarking with 3 input points void benchmark_bls_g2_weighted_sum_three_point() { - benchmark_bls_g2_weighted_sum("bls_g2_weighted_sum 3 points", 3); + benchmark_bls_g2_weighted_sum_impl("bls_g2_weighted_sum 3 points", 3, false); +} + +// bls_g2_weighted_sum benchmarking with 5 input points +void benchmark_bls_g2_weighted_sum_five_point() { + benchmark_bls_g2_weighted_sum_impl("bls_g2_weighted_sum 5 points", 5, false); +} + +// bls_g2_weighted_sum_mont benchmarking with 1 input point +void benchmark_bls_g2_weighted_sum_mont_one_point() { + benchmark_bls_g2_weighted_sum_impl("bls_g2_weighted_sum_mont 1 point", 1, false); +} + +// bls_g2_weighted_sum_mont benchmarking with 3 input points +void benchmark_bls_g2_weighted_sum_mont_three_point() { + benchmark_bls_g2_weighted_sum_impl("bls_g2_weighted_sum_mont 3 points", 3, false); +} + +// bls_g2_weighted_sum_mont benchmarking with 5 input points +void benchmark_bls_g2_weighted_sum_mont_five_point() { + benchmark_bls_g2_weighted_sum_impl("bls_g2_weighted_sum_mont 5 points", 5, false); } // bls_pairing benchmarking utility -void benchmark_bls_pairing(std::string test_name, uint32_t num_pairs) { +void benchmark_bls_pairing_impl(std::string test_name, uint32_t num_pairs, bool mont) { // prepare g1 operand std::vector g1_buf(96*num_pairs); //g1_buf.reserve(96*num_pairs); for (auto i=0u; i < num_pairs; ++i) { g1 p = random_g1(); - p.toAffineBytesLE(std::span((uint8_t*)g1_buf.data() + i * 96, 96), true); + p.toAffineBytesLE(std::span((uint8_t*)g1_buf.data() + i * 96, 96), mont); } eosio::chain::span g1_points(g1_buf.data(), g1_buf.size()); @@ -313,7 +370,7 @@ void benchmark_bls_pairing(std::string test_name, uint32_t num_pairs) { std::vector g2_buf(192*num_pairs); for (auto i=0u; i < num_pairs; ++i) { g2 p2 = random_g2(); - p2.toAffineBytesLE(std::span((uint8_t*)g2_buf.data() + i * 192, (192)), true); + p2.toAffineBytesLE(std::span((uint8_t*)g2_buf.data() + i * 192, (192)), mont); } eosio::chain::span g2_points(g2_buf.data(), g2_buf.size()); @@ -323,28 +380,47 @@ void benchmark_bls_pairing(std::string test_name, uint32_t num_pairs) { // set up bls_pairing to be benchmarked interface_in_benchmark interface; - auto benchmarked_func = [&]() { - interface.interface->bls_pairing(g1_points, g2_points, num_pairs, result); - }; + std::function benchmarked_func {}; + if (mont) { + benchmarked_func = [&]() { + interface.interface->bls_pairing_mont(g1_points, g2_points, num_pairs, result); + }; + } else { + benchmarked_func = [&]() { + interface.interface->bls_pairing(g1_points, g2_points, num_pairs, result); + }; + } benchmarking(test_name, benchmarked_func); } // bls_pairing benchmarking with 1 input pair void benchmark_bls_pairing_one_pair() { - benchmark_bls_pairing("bls_pairing 1 pair", 1); + benchmark_bls_pairing_impl("bls_pairing 1 pair", 1, false); } // bls_pairing benchmarking with 3 input pairs void benchmark_bls_pairing_three_pair() { - benchmark_bls_pairing("bls_pairing 3 pairs", 3); + benchmark_bls_pairing_impl("bls_pairing 3 pairs", 3, false); +} + +// bls_pairing_mont benchmarking with 1 input pair +void benchmark_bls_pairing_mont_one_pair() { + benchmark_bls_pairing_impl("bls_pairing_mont 1 pair", 1, true); +} + +// bls_pairing_mont benchmarking with 3 input pairs +void benchmark_bls_pairing_mont_three_pair() { + benchmark_bls_pairing_impl("bls_pairing_mont 3 pairs", 3, true); } // bls_g1_map benchmarking -void benchmark_bls_g1_map() { +void benchmark_bls_g1_map_impl(std::string test_name, bool mont) { // prepare e operand. Must be fp LE. - std::vector e_buf = {0xc9, 0x3f,0x81,0x7b, 0x15, 0x9b, 0xdf, 0x84, 0x04, 0xdc, 0x37, 0x85, 0x14, 0xf8, 0x45, 0x19, 0x2b, 0xba, 0xe4, 0xfa, 0xac, 0x7f, 0x4a, 0x56, 0x89, 0x24, 0xf2, 0xd9, 0x72, 0x51, 0x25, 0x00, 0x04, 0x89, 0x40, 0x8f, 0xd7, 0x96, 0x46, 0x1c, 0x28, 0x89, 0x00, 0xad, 0xd0, 0x0d, 0x46, 0x18}; - eosio::chain::span e((char*)e_buf.data(), e_buf.size()); + std::vector e_buf(48); + fp a = random_fe(); + a.toBytesLE(std::span((uint8_t*)e_buf.data(), 48), mont); + eosio::chain::span e(e_buf.data(), e_buf.size()); // prepare result operand std::vector result_buf(96); @@ -352,18 +428,35 @@ void benchmark_bls_g1_map() { // set up bls_g1_map to be benchmarked interface_in_benchmark interface; - auto benchmarked_func = [&]() { - interface.interface->bls_g1_map(e, result); - }; + std::function benchmarked_func {}; + if (mont) { + benchmarked_func = [&]() { + interface.interface->bls_g1_map_mont(e, result); + }; + } else { + benchmarked_func = [&]() { + interface.interface->bls_g1_map(e, result); + }; + } - benchmarking("bls_g1_map", benchmarked_func); + benchmarking(test_name, benchmarked_func); +} + +void benchmark_bls_g1_map() { + benchmark_bls_g1_map_impl("bls_g1_map", false); +} + +void benchmark_bls_g1_map_mont() { + benchmark_bls_g1_map_impl("bls_g1_map_mont", true); } // bls_g2_map benchmarking -void benchmark_bls_g2_map() { +void benchmark_bls_g2_map_impl(std::string test_name, bool mont) { // prepare e operand. Must be fp2 LE. - std::vector e_buf = {0xd4, 0xf2, 0xcf, 0xec, 0x99, 0x38, 0x78, 0x09, 0x57, 0x4f, 0xcc, 0x2d, 0xba, 0x10, 0x56, 0x03, 0xd9, 0x50, 0xd4, 0x90, 0xe2, 0xbe, 0xbe, 0x0c, 0x21, 0x2c, 0x05, 0xe1, 0x6b, 0x78, 0x47, 0x45, 0xef, 0x4f, 0xe8, 0xe7, 0x0b, 0x55, 0x4d, 0x0a, 0x52, 0xfe, 0x0b, 0xed, 0x5e, 0xa6, 0x69, 0x0a, 0xde, 0x23, 0x48, 0xeb, 0x89, 0x72, 0xa9, 0x67, 0x40, 0xa4, 0x30, 0xdf, 0x16, 0x2d, 0x92, 0x0e, 0x17, 0x5f, 0x59, 0x23, 0xa7, 0x6d, 0x18, 0x65, 0x0e, 0xa2, 0x4a, 0x8e, 0xc0, 0x6d, 0x41, 0x4c, 0x6d, 0x1d, 0x21, 0x8d, 0x67, 0x3d, 0xac, 0x36, 0x19, 0xa1, 0xa5, 0xc1, 0x42, 0x78, 0x57, 0x08}; - eosio::chain::span e((char*)e_buf.data(), e_buf.size()); + std::vector e_buf(96); + fp2 a = random_fe2(); + a.toBytesLE(std::span((uint8_t*)e_buf.data(), 96), mont); + eosio::chain::span e(e_buf.data(), e_buf.size()); // prepare result operand std::vector result_buf(192); @@ -371,15 +464,30 @@ void benchmark_bls_g2_map() { // set up bls_g2_map to be benchmarked interface_in_benchmark interface; - auto benchmarked_func = [&]() { - interface.interface->bls_g2_map(e, result); - }; + std::function benchmarked_func {}; + if (mont) { + benchmarked_func = [&]() { + interface.interface->bls_g2_map_mont(e, result); + }; + } else { + benchmarked_func = [&]() { + interface.interface->bls_g2_map(e, result); + }; + } + + benchmarking(test_name, benchmarked_func); +} + +void benchmark_bls_g2_map() { + benchmark_bls_g2_map_impl("bls_g2_map", false); +} - benchmarking("bls_g2_map", benchmarked_func); +void benchmark_bls_g2_map_mont() { + benchmark_bls_g2_map_impl("bls_g2_map_mont", true); } // bls_fp_mod benchmarking -void benchmark_bls_fp_mod() { +void benchmark_bls_fp_mod_impl(std::string test_name, bool mont) { // prepare scalar operand std::vector scalar_buf(64); // random_scalar returns 32 bytes. need to call it twice @@ -395,27 +503,144 @@ void benchmark_bls_fp_mod() { // set up bls_fp_mod to be benchmarked interface_in_benchmark interface; - auto benchmarked_func = [&]() { - interface.interface->bls_fp_mod(scalar, result); - }; + std::function benchmarked_func {}; + if (mont) { + benchmarked_func = [&]() { + interface.interface->bls_fp_mod_mont(scalar, result); + }; + } else { + benchmarked_func = [&]() { + interface.interface->bls_fp_mod(scalar, result); + }; + } + + benchmarking(test_name, benchmarked_func); +} + +void benchmark_bls_fp_mod() { + benchmark_bls_fp_mod_impl("bls_fp_mod", false); +} + +void benchmark_bls_fp_mod_mont() { + benchmark_bls_fp_mod_impl("bls_fp_mod_mont", true); +} + +void benchmark_bls_fp_mul_impl(std::string test_name, bool mont) { + // prepare op1 + std::vector op1_buf(48); + fp a = random_fe(); + a.toBytesLE(std::span((uint8_t*)op1_buf.data(), 48), mont); + eosio::chain::span op1(op1_buf.data(), op1_buf.size()); + + // prepare op2 + std::vector op2_buf(48); + fp b = random_fe(); + b.toBytesLE(std::span((uint8_t*)op2_buf.data(), 48), mont); + eosio::chain::span op2(op1_buf.data(), op2_buf.size()); + + // prepare result operand + std::vector result_buf(48); + eosio::chain::span result(result_buf.data(), result_buf.size()); + + // set up bls_pairing to be benchmarked + interface_in_benchmark interface; + std::function benchmarked_func {}; + if (mont) { + benchmarked_func = [&]() { + interface.interface->bls_fp_mul_mont(op1, op2, result); + }; + } else { + benchmarked_func = [&]() { + interface.interface->bls_fp_mul(op1, op2, result); + }; + } + + benchmarking(test_name, benchmarked_func); +} + +void benchmark_bls_fp_mul() { + benchmark_bls_fp_mul_impl("bls_fp_mul", false); +} + +void benchmark_bls_fp_mul_mont() { + benchmark_bls_fp_mul_impl("bls_fp_mul_mont", true); +} + +void benchmark_bls_fp_exp_impl(std::string test_name, bool mont) { + // prepare base + std::vector base_buf(48); + fp a = random_fe(); + a.toBytesLE(std::span((uint8_t*)base_buf.data(), 48), mont); + eosio::chain::span base(base_buf.data(), base_buf.size()); + + // prepare exp operand + std::vector exp_buf(64); + // random_scalar returns 32 bytes. need to call it twice + for (auto i=0u; i < 2; ++i) { + std::array s = random_scalar(); + scalar::toBytesLE(s, std::span((uint8_t*)exp_buf.data() + i*32, 32)); + } + eosio::chain::span exp(exp_buf.data(), exp_buf.size()); + + // prepare result operand + std::vector result_buf(48); + eosio::chain::span result(result_buf.data(), result_buf.size()); + + // set up bls_fp_exp to be benchmarked + interface_in_benchmark interface; + std::function benchmarked_func {}; + if (mont) { + benchmarked_func = [&]() { + interface.interface->bls_fp_exp_mont(base, exp, result); + }; + } else { + benchmarked_func = [&]() { + interface.interface->bls_fp_exp(base, exp, result); + }; + } + + benchmarking(test_name, benchmarked_func); +} + +void benchmark_bls_fp_exp() { + benchmark_bls_fp_exp_impl("bls_fp_exp", false); +} - benchmarking("bls_fp_mod", benchmarked_func); +void benchmark_bls_fp_exp_mont() { + benchmark_bls_fp_exp_impl("bls_fp_exp_mont", true); } // register benchmarking functions void bls_benchmarking() { benchmark_bls_g1_add(); + benchmark_bls_g1_add_mont(); benchmark_bls_g2_add(); - // benchmark_bls_g1_mul(); - // benchmark_bls_g2_mul(); + benchmark_bls_g2_add_mont(); benchmark_bls_pairing_one_pair(); benchmark_bls_pairing_three_pair(); + benchmark_bls_pairing_mont_one_pair(); + benchmark_bls_pairing_mont_three_pair(); benchmark_bls_g1_weighted_sum_one_point(); benchmark_bls_g1_weighted_sum_three_point(); + benchmark_bls_g1_weighted_sum_five_point(); + benchmark_bls_g1_weighted_sum_mont_one_point(); + benchmark_bls_g1_weighted_sum_mont_three_point(); + benchmark_bls_g1_weighted_sum_mont_five_point(); benchmark_bls_g2_weighted_sum_one_point(); benchmark_bls_g2_weighted_sum_three_point(); + benchmark_bls_g2_weighted_sum_five_point(); + benchmark_bls_g2_weighted_sum_mont_one_point(); + benchmark_bls_g2_weighted_sum_mont_three_point(); + benchmark_bls_g2_weighted_sum_mont_five_point(); benchmark_bls_g1_map(); + benchmark_bls_g1_map_mont(); benchmark_bls_g2_map(); + benchmark_bls_g2_map_mont(); benchmark_bls_fp_mod(); + benchmark_bls_fp_mod_mont(); + benchmark_bls_fp_mul(); + benchmark_bls_fp_mul_mont(); + benchmark_bls_fp_exp(); + benchmark_bls_fp_exp_mont(); } } // namespace benchmark From 9d35e5a328472be02abb61f5f0961b6afdeb1d2d Mon Sep 17 00:00:00 2001 From: yarkin Date: Wed, 15 Nov 2023 15:36:27 +0800 Subject: [PATCH 10/24] Add tests for fp_mod, fp_exp, fp_mul --- unittests/bls_primitives_tests.cpp | 187 ++++++++++++++++++ .../bls_primitives_test.abi | 77 ++++++++ .../bls_primitives_test.cpp | 44 +++++ .../bls_primitives_test.hpp | 16 ++ .../bls_primitives_test.wasm | Bin 5237 -> 6699 bytes 5 files changed, 324 insertions(+) diff --git a/unittests/bls_primitives_tests.cpp b/unittests/bls_primitives_tests.cpp index e08bedf25d..70c58148bb 100644 --- a/unittests/bls_primitives_tests.cpp +++ b/unittests/bls_primitives_tests.cpp @@ -648,4 +648,191 @@ BOOST_AUTO_TEST_CASE( bls_empty ) { try { } FC_LOG_AND_RETHROW() } +BOOST_AUTO_TEST_CASE( bls_testfpmul ) { try { + tester c( setup_policy::preactivate_feature_and_new_bios ); + + const auto& tester1_account = account_name("tester1"); + c.create_accounts( {tester1_account} ); + c.produce_block(); + + const auto& pfm = c.control->get_protocol_feature_manager(); + const auto& d = pfm.get_builtin_digest( builtin_protocol_feature_t::bls_primitives ); + BOOST_REQUIRE( d ); + + c.preactivate_protocol_features( {*d} ); + c.produce_block(); + + c.set_code( tester1_account, test_contracts::bls_primitives_test_wasm() ); + c.set_abi( tester1_account, test_contracts::bls_primitives_test_abi().data() ); + c.produce_block(); + + using test_add = std::tuple; + const std::vector tests = { + { + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::failure + }, + { + "ABAAFFFFFFFFFEB9FFFF53B1FEFFAB1E24F6B0F6A0D23067BF1285F3844B7764D7AC4B43B6A71B4B9AE67F39EA11011A", + "ABAAFFFFFFFFFEB9FFFF53B1FEFFAB1E24F6B0F6A0D23067BF1285F3844B7764D7AC4B43B6A71B4B9AE67F39EA11011A", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::failure + }, + { + "010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::success + }, + { + "AAAAFFFFFFFFFEB9FFFF53B1FEFFAB1E24F6B0F6A0D23067BF1285F3844B7764D7AC4B43B6A71B4B9AE67F39EA11011A", + "AAAAFFFFFFFFFEB9FFFF53B1FEFFAB1E24F6B0F6A0D23067BF1285F3844B7764D7AC4B43B6A71B4B9AE67F39EA11011A", + "010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::success + }, + }; + + for(const auto& test : tests) { + auto op1 = hex2bin(std::get<0>(test)); + auto op2 = hex2bin(std::get<1>(test)); + auto expected_result = hex2bin(std::get<2>(test)); + auto expected_error = std::get<3>(test); + + c.push_action( tester1_account, "testfpmul"_n, tester1_account, mutable_variant_object() + ("op1", op1) + ("op2", op2) + ("res", expected_result) + ("expected_error", expected_error) + ); + } + +} FC_LOG_AND_RETHROW() } + +BOOST_AUTO_TEST_CASE( bls_testfpexp ) { try { + tester c( setup_policy::preactivate_feature_and_new_bios ); + + const auto& tester1_account = account_name("tester1"); + c.create_accounts( {tester1_account} ); + c.produce_block(); + + const auto& pfm = c.control->get_protocol_feature_manager(); + const auto& d = pfm.get_builtin_digest( builtin_protocol_feature_t::bls_primitives ); + BOOST_REQUIRE( d ); + + c.preactivate_protocol_features( {*d} ); + c.produce_block(); + + c.set_code( tester1_account, test_contracts::bls_primitives_test_wasm() ); + c.set_abi( tester1_account, test_contracts::bls_primitives_test_abi().data() ); + c.produce_block(); + + using test_add = std::tuple; + const std::vector tests = { + { + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::failure + }, + { + "ABAAFFFFFFFFFEB9FFFF53B1FEFFAB1E24F6B0F6A0D23067BF1285F3844B7764D7AC4B43B6A71B4B9AE67F39EA11011A", + "ABAAFFFFFFFFFEB9FFFF53B1FEFFAB1E24F6B0F6A0D23067BF1285F3844B7764D7AC4B43B6A71B4B9AE67F39EA11011A00000000000000000000000000000000", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::failure + }, + { + "010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::success + }, + { + "AAAAFFFFFFFFFEB9FFFF53B1FEFFAB1E24F6B0F6A0D23067BF1285F3844B7764D7AC4B43B6A71B4B9AE67F39EA11011A", + "AAAAFFFFFFFFFEB9FFFF53B1FEFFAB1E24F6B0F6A0D23067BF1285F3844B7764D7AC4B43B6A71B4B9AE67F39EA11011A00000000000000000000000000000000", + "010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::success + }, + }; + + for(const auto& test : tests) { + auto base = hex2bin(std::get<0>(test)); + auto exp = hex2bin(std::get<1>(test)); + auto expected_result = hex2bin(std::get<2>(test)); + auto expected_error = std::get<3>(test); + + c.push_action( tester1_account, "testfpexp"_n, tester1_account, mutable_variant_object() + ("base", base) + ("exp", exp) + ("res", expected_result) + ("expected_error", expected_error) + ); + } + +} FC_LOG_AND_RETHROW() } + + +BOOST_AUTO_TEST_CASE( bls_testfpmod ) { try { + tester c( setup_policy::preactivate_feature_and_new_bios ); + + const auto& tester1_account = account_name("tester1"); + c.create_accounts( {tester1_account} ); + c.produce_block(); + + const auto& pfm = c.control->get_protocol_feature_manager(); + const auto& d = pfm.get_builtin_digest( builtin_protocol_feature_t::bls_primitives ); + BOOST_REQUIRE( d ); + + c.preactivate_protocol_features( {*d} ); + c.produce_block(); + + c.set_code( tester1_account, test_contracts::bls_primitives_test_wasm() ); + c.set_abi( tester1_account, test_contracts::bls_primitives_test_abi().data() ); + c.produce_block(); + + using test_add = std::tuple; + const std::vector tests = { + { + "AAAAFFFFFFFFFEB9FFFF53B1FEFFAB1E24F6B0F6A0D23067BF1285F3844B7764D7AC4B43B6A71B4B9AE67F39EA11011A00000000000000000000000000000000", + "AAAAFFFFFFFFFEB9FFFF53B1FEFFAB1E24F6B0F6A0D23067BF1285F3844B7764D7AC4B43B6A71B4B9AE67F39EA11011A", + return_code::success + }, + { + "ABAAFFFFFFFFFEB9FFFF53B1FEFFAB1E24F6B0F6A0D23067BF1285F3844B7764D7AC4B43B6A71B4B9AE67F39EA11011A00000000000000000000000000000000", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::success + }, + { + "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::success + }, + { + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::success + }, + { + "ACAAFFFFFFFFFEB9FFFF53B1FEFFAB1E24F6B0F6A0D23067BF1285F3844B7764D7AC4B43B6A71B4B9AE67F39EA11011A00000000000000000000000000000000", + "010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::success + }, + }; + + for(const auto& test : tests) { + auto s = hex2bin(std::get<0>(test)); + auto expected_result = hex2bin(std::get<1>(test)); + auto expected_error = std::get<2>(test); + + c.push_action( tester1_account, "testfpmod"_n, tester1_account, mutable_variant_object() + ("s", s) + ("res", expected_result) + ("expected_error", expected_error) + ); + } + +} FC_LOG_AND_RETHROW() } + + BOOST_AUTO_TEST_SUITE_END() diff --git a/unittests/test-contracts/bls_primitives_test/bls_primitives_test.abi b/unittests/test-contracts/bls_primitives_test/bls_primitives_test.abi index 1e04dc2e5a..a16a65107e 100644 --- a/unittests/test-contracts/bls_primitives_test/bls_primitives_test.abi +++ b/unittests/test-contracts/bls_primitives_test/bls_primitives_test.abi @@ -3,6 +3,68 @@ "version": "eosio::abi/1.2", "types": [], "structs": [ + { + "name": "testfpexp", + "base": "", + "fields": [ + { + "name": "base", + "type": "bytes" + }, + { + "name": "exp", + "type": "bytes" + }, + { + "name": "res", + "type": "bytes" + }, + { + "name": "expected_error", + "type": "int32" + } + ] + }, + { + "name": "testfpmod", + "base": "", + "fields": [ + { + "name": "s", + "type": "bytes" + }, + { + "name": "res", + "type": "bytes" + }, + { + "name": "expected_error", + "type": "int32" + } + ] + }, + { + "name": "testfpmul", + "base": "", + "fields": [ + { + "name": "op1", + "type": "bytes" + }, + { + "name": "op2", + "type": "bytes" + }, + { + "name": "res", + "type": "bytes" + }, + { + "name": "expected_error", + "type": "int32" + } + ] + }, { "name": "testg1add", "base": "", @@ -163,6 +225,21 @@ } ], "actions": [ + { + "name": "testfpexp", + "type": "testfpexp", + "ricardian_contract": "" + }, + { + "name": "testfpmod", + "type": "testfpmod", + "ricardian_contract": "" + }, + { + "name": "testfpmul", + "type": "testfpmul", + "ricardian_contract": "" + }, { "name": "testg1add", "type": "testg1add", diff --git a/unittests/test-contracts/bls_primitives_test/bls_primitives_test.cpp b/unittests/test-contracts/bls_primitives_test/bls_primitives_test.cpp index 413e8745d5..73cee1c890 100644 --- a/unittests/test-contracts/bls_primitives_test/bls_primitives_test.cpp +++ b/unittests/test-contracts/bls_primitives_test/bls_primitives_test.cpp @@ -106,3 +106,47 @@ void bls_primitives_test::testg2map(const std::vector& e, const std::ve check(error == expected_error, "bls_g2_map: Error does not match"); check(0 == std::memcmp(r, res.data(), sizeof(bls_g2)), "bls_g2_map: Result does not match"); } + +void bls_primitives_test::testfpmul(const std::vector& op1, const std::vector& op2, const std::vector& res, int32_t expected_error) +{ + bls_fp r; + int32_t error = internal_use_do_not_use::bls_fp_mul( + reinterpret_cast(op1.data()), + sizeof(bls_fp), + reinterpret_cast(op2.data()), + sizeof(bls_fp), + reinterpret_cast(r), + sizeof(bls_fp) + ); + check(error == expected_error, "bls_fp_mul: Error does not match"); + check(0 == std::memcmp(r, res.data(), sizeof(bls_fp)), "bls_fp_mul: Result does not match"); +} + +void bls_primitives_test::testfpexp(const std::vector& base, const std::vector& exp, const std::vector& res, int32_t expected_error) +{ + bls_fp r; + int32_t error = internal_use_do_not_use::bls_fp_exp( + reinterpret_cast(base.data()), + sizeof(bls_fp), + reinterpret_cast(exp.data()), + sizeof(bls_scalar_large), + reinterpret_cast(r), + sizeof(bls_fp) + ); + check(error == expected_error, "bls_fp_exp: Error does not match"); + check(0 == std::memcmp(r, res.data(), sizeof(bls_fp)), "bls_fp_exp: Result does not match"); +} + + +void bls_primitives_test::testfpmod(const std::vector& s, const std::vector& res, int32_t expected_error) +{ + bls_fp r; + int32_t error = internal_use_do_not_use::bls_fp_mod( + reinterpret_cast(s.data()), + sizeof(bls_scalar_large), + reinterpret_cast(r), + sizeof(bls_fp) + ); + check(error == expected_error, "bls_fp_mod: Error does not match"); + check(0 == std::memcmp(r, res.data(), sizeof(bls_fp)), "bls_fp_mod: Result does not match"); +} diff --git a/unittests/test-contracts/bls_primitives_test/bls_primitives_test.hpp b/unittests/test-contracts/bls_primitives_test/bls_primitives_test.hpp index 78999625dd..e519f1ae59 100644 --- a/unittests/test-contracts/bls_primitives_test/bls_primitives_test.hpp +++ b/unittests/test-contracts/bls_primitives_test/bls_primitives_test.hpp @@ -2,6 +2,7 @@ #include +using bls_scalar_large = uint8_t[64]; using bls_scalar = uint8_t[32]; using bls_fp = uint8_t[48]; using bls_fp2 = bls_fp[2]; @@ -35,6 +36,12 @@ namespace eosio { __attribute__((eosio_wasm_import)) int32_t bls_fp_mod(const char* s, uint32_t s_len, char* res, uint32_t res_len); + + __attribute__((eosio_wasm_import)) + int32_t bls_fp_mul(const char* op1, uint32_t op1_len, const char* op2, uint32_t op2_len, char* res, uint32_t res_len); + + __attribute__((eosio_wasm_import)) + int32_t bls_fp_exp(const char* base, uint32_t base_len, const char* exp, uint32_t exp_len, char* res, uint32_t res_len); } } } @@ -63,4 +70,13 @@ class [[eosio::contract]] bls_primitives_test : public eosio::contract { [[eosio::action]] void testg2map(const std::vector& e, const std::vector& res, int32_t expected_error); + + [[eosio::action]] + void testfpmul(const std::vector& op1, const std::vector& op2, const std::vector& res, int32_t expected_error); + + [[eosio::action]] + void testfpexp(const std::vector& base, const std::vector& exp, const std::vector& res, int32_t expected_error); + + [[eosio::action]] + void testfpmod(const std::vector& s, const std::vector& res, int32_t expected_error); }; diff --git a/unittests/test-contracts/bls_primitives_test/bls_primitives_test.wasm b/unittests/test-contracts/bls_primitives_test/bls_primitives_test.wasm index d3bf5ab64c0bcd321cb846ce5214a7b98ccd33fe..569831c44ae93fab4a037b0f0a89799fb880cae9 100755 GIT binary patch delta 1865 zcmcIlO-vI(6rP#=>CbfAfeMti*lnp;5R(#!peCk^KZzVP9Q7d4fW}&A6Muppq#Qh{ zMDn~D3>ps_50W4UCB%{d2SZduBg)kpFDfzd;LX`xN^N6M16*czzIl1y_r7^=_ebPm z(~Z-@f>1t~xU=1UB5}6kWU8b4d;(#itLH)v=;}=s0^P~ZQ46+Xx2FP8i$g&UMR6)F znYdgo2$DeGl^I0)kfuK@HY^=ar4koWh5c%6g@~As&Jv^|7GUKnQgOQ&YfYzzpU-Bp z3vDXlTODOV$w0477NB7reLeHDFm{WHKFP(xGa~oZaByUPd}#jD?`gLhX~#YmCWx5m zy<7rQLal+m$v!QRP-mcD-WHZG92dhCH78Y*&RlCCS+5l+&k6q5`o>q??m)M8z}=Pa}c~wC}JBUXWT2ZsW_%0gf3yZT5Y-S#h*&9NHGzCS<4;*n-)I{DMhuFRx z`vdq^l4pOxHkj836D4)r;?E_^7Voaom8D5MjOcX%i+$BdOXD*k5)@Pt=5r7fNsO&^ zu3EIH%6(AvhxQ7^wJ5V5Fs5u^iq8+_^J?IF5aWl-SMzA9xVx9-VqNaQhRNNTlbb;+ zdTplOxz+T3UsdlMG3{MK|7Gu5Tg}&CRFN@Ux0_Ym)W2G$>l`m~eQY}Ky3=TnC8YaJ z2V{tr9wv{a(f-m23{kfzn}0jF?DpkehuwaOqg}l)>Gta&|M>w2jq_xu9;%;rCtFj4pa}Nv#1dnI9we6;=KGoNHFKl99xNPJt}3ZU zZK+kk6mvU`Si~@qVVag1*9aUYUU0vS*gOh5TO@|n>fBuIG)n8Qyfj5T$IcNX5Z}a8 zut?nOW_5SHe(Cx7M{BS53o=bB0tw6u@PgP!ik;cZXLtK&qY}Nfa_{2G`#*2^zj*Gf zKJ4Qe+d!}MGmJxB@o*9@D?6e|##o5>Nb8+qV4Q(()Yr01MVvuioxoA38fgh{;|`8N z!zg19KIty;91x}>4{y~RX|`c9Zetx1+5v3CQLTs_m`r4`)3oFQx3vWQ3jbe!F1(3tmmW=hz~eF9|5w;vO2IlQzgj^L>IQdUnN3OJk8FT=moY5yS#v68 z?=@xQaOp98XHI{+Icr#fWtM_d@vU8vwZDk0#|K3g6D8Tg8Tl_fsAh7xjW<;SQZ7&? zl+c(JG^Fxb8yOc?`4-uYmH6Ea>`M$qxHCD?wfp5suM^AZNY}}%j~IJOVI+Hyd{$Z~ Ovkx%*$d_oPh|o`jCge2$ From 4255d62daa000a680dd3f34bdfd581c7c1a7057e Mon Sep 17 00:00:00 2001 From: yarkin Date: Wed, 15 Nov 2023 16:34:39 +0800 Subject: [PATCH 11/24] Add more test case and update submodule (only contains test updates). --- libraries/libfc/libraries/bls12-381 | 2 +- unittests/bls_primitives_tests.cpp | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/libraries/libfc/libraries/bls12-381 b/libraries/libfc/libraries/bls12-381 index e3893a85cd..ec8e8d5858 160000 --- a/libraries/libfc/libraries/bls12-381 +++ b/libraries/libfc/libraries/bls12-381 @@ -1 +1 @@ -Subproject commit e3893a85cd1598cb8ff1bfa288898148249237d4 +Subproject commit ec8e8d585873e1775983782c274792da6315acf2 diff --git a/unittests/bls_primitives_tests.cpp b/unittests/bls_primitives_tests.cpp index 70c58148bb..298e6d4fcd 100644 --- a/unittests/bls_primitives_tests.cpp +++ b/unittests/bls_primitives_tests.cpp @@ -748,6 +748,12 @@ BOOST_AUTO_TEST_CASE( bls_testfpexp ) { try { "010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", return_code::success }, + { + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::success + }, { "AAAAFFFFFFFFFEB9FFFF53B1FEFFAB1E24F6B0F6A0D23067BF1285F3844B7764D7AC4B43B6A71B4B9AE67F39EA11011A", "AAAAFFFFFFFFFEB9FFFF53B1FEFFAB1E24F6B0F6A0D23067BF1285F3844B7764D7AC4B43B6A71B4B9AE67F39EA11011A00000000000000000000000000000000", From 8819030169c0e590bfa0f7b48b40fbc5c821695f Mon Sep 17 00:00:00 2001 From: Lin Huang Date: Wed, 15 Nov 2023 12:12:03 -0500 Subject: [PATCH 12/24] fix weighted sum montgomery form flag --- benchmark/bls.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/benchmark/bls.cpp b/benchmark/bls.cpp index 623ac1c281..98985c0d7d 100644 --- a/benchmark/bls.cpp +++ b/benchmark/bls.cpp @@ -274,17 +274,17 @@ void benchmark_bls_g1_weighted_sum_five_point() { // bls_g1_weighted_sum benchmarking with 1 input point void benchmark_bls_g1_weighted_sum_mont_one_point() { - benchmark_bls_g1_weighted_sum_impl("bls_g1_weighted_sum_mont 1 point", 1, false); + benchmark_bls_g1_weighted_sum_impl("bls_g1_weighted_sum_mont 1 point", 1, true); } // bls_g1_weighted_sum_mont benchmarking with 3 input points void benchmark_bls_g1_weighted_sum_mont_three_point() { - benchmark_bls_g1_weighted_sum_impl("bls_g1_weighted_sum_mont 3 points", 3, false); + benchmark_bls_g1_weighted_sum_impl("bls_g1_weighted_sum_mont 3 points", 3, true); } // bls_g1_weighted_sum_mont benchmarking with 5 input points void benchmark_bls_g1_weighted_sum_mont_five_point() { - benchmark_bls_g1_weighted_sum_impl("bls_g1_weighted_sum_mont 5 points", 5, false); + benchmark_bls_g1_weighted_sum_impl("bls_g1_weighted_sum_mont 5 points", 5, true); } // bls_g2_weighted_sum benchmarking utility @@ -342,17 +342,17 @@ void benchmark_bls_g2_weighted_sum_five_point() { // bls_g2_weighted_sum_mont benchmarking with 1 input point void benchmark_bls_g2_weighted_sum_mont_one_point() { - benchmark_bls_g2_weighted_sum_impl("bls_g2_weighted_sum_mont 1 point", 1, false); + benchmark_bls_g2_weighted_sum_impl("bls_g2_weighted_sum_mont 1 point", 1, true); } // bls_g2_weighted_sum_mont benchmarking with 3 input points void benchmark_bls_g2_weighted_sum_mont_three_point() { - benchmark_bls_g2_weighted_sum_impl("bls_g2_weighted_sum_mont 3 points", 3, false); + benchmark_bls_g2_weighted_sum_impl("bls_g2_weighted_sum_mont 3 points", 3, true); } // bls_g2_weighted_sum_mont benchmarking with 5 input points void benchmark_bls_g2_weighted_sum_mont_five_point() { - benchmark_bls_g2_weighted_sum_impl("bls_g2_weighted_sum_mont 5 points", 5, false); + benchmark_bls_g2_weighted_sum_impl("bls_g2_weighted_sum_mont 5 points", 5, true); } // bls_pairing benchmarking utility @@ -617,20 +617,20 @@ void bls_benchmarking() { benchmark_bls_g2_add(); benchmark_bls_g2_add_mont(); benchmark_bls_pairing_one_pair(); - benchmark_bls_pairing_three_pair(); benchmark_bls_pairing_mont_one_pair(); + benchmark_bls_pairing_three_pair(); benchmark_bls_pairing_mont_three_pair(); benchmark_bls_g1_weighted_sum_one_point(); - benchmark_bls_g1_weighted_sum_three_point(); - benchmark_bls_g1_weighted_sum_five_point(); benchmark_bls_g1_weighted_sum_mont_one_point(); + benchmark_bls_g1_weighted_sum_three_point(); benchmark_bls_g1_weighted_sum_mont_three_point(); + benchmark_bls_g1_weighted_sum_five_point(); benchmark_bls_g1_weighted_sum_mont_five_point(); benchmark_bls_g2_weighted_sum_one_point(); - benchmark_bls_g2_weighted_sum_three_point(); - benchmark_bls_g2_weighted_sum_five_point(); benchmark_bls_g2_weighted_sum_mont_one_point(); + benchmark_bls_g2_weighted_sum_three_point(); benchmark_bls_g2_weighted_sum_mont_three_point(); + benchmark_bls_g2_weighted_sum_five_point(); benchmark_bls_g2_weighted_sum_mont_five_point(); benchmark_bls_g1_map(); benchmark_bls_g1_map_mont(); From f280d5ee169dbc4ba26e2177b3fc4ac965f4194e Mon Sep 17 00:00:00 2001 From: Lin Huang Date: Wed, 15 Nov 2023 13:29:19 -0500 Subject: [PATCH 13/24] add const& to std::string parameters in all _impl methods --- benchmark/bls.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/benchmark/bls.cpp b/benchmark/bls.cpp index 98985c0d7d..72e46b19f6 100644 --- a/benchmark/bls.cpp +++ b/benchmark/bls.cpp @@ -148,7 +148,7 @@ bls12_381::g2 random_g2() } // bls_g1_add benchmarking -void benchmark_bls_g1_add_impl(std::string test_name, bool mont) { +void benchmark_bls_g1_add_impl(const std::string& test_name, bool mont) { // prepare g1 operand in Jacobian LE format g1 p = random_g1(); std::vector buf(96); @@ -184,7 +184,7 @@ void benchmark_bls_g1_add_mont() { } // bls_g2_add benchmarking -void benchmark_bls_g2_add_impl(std::string test_name, bool mont) { +void benchmark_bls_g2_add_impl(const std::string& test_name, bool mont) { // prepare g2 operand in Jacobian LE format g2 p = random_g2(); std::vector buf(192); @@ -220,7 +220,7 @@ void benchmark_bls_g2_add_mont() { } // bls_g1_weighted_sum benchmarking utility -void benchmark_bls_g1_weighted_sum_impl(std::string test_name, uint32_t num_points, bool mont) { +void benchmark_bls_g1_weighted_sum_impl(const std::string& test_name, uint32_t num_points, bool mont) { // prepare g1 points operand std::vector g1_buf(96*num_points); for (auto i=0u; i < num_points; ++i) { @@ -288,7 +288,7 @@ void benchmark_bls_g1_weighted_sum_mont_five_point() { } // bls_g2_weighted_sum benchmarking utility -void benchmark_bls_g2_weighted_sum_impl(std::string test_name, uint32_t num_points, bool mont) { +void benchmark_bls_g2_weighted_sum_impl(const std::string& test_name, uint32_t num_points, bool mont) { // prepare g2 points operand std::vector g2_buf(192*num_points); for (auto i=0u; i < num_points; ++i) { @@ -356,7 +356,7 @@ void benchmark_bls_g2_weighted_sum_mont_five_point() { } // bls_pairing benchmarking utility -void benchmark_bls_pairing_impl(std::string test_name, uint32_t num_pairs, bool mont) { +void benchmark_bls_pairing_impl(const std::string& test_name, uint32_t num_pairs, bool mont) { // prepare g1 operand std::vector g1_buf(96*num_pairs); //g1_buf.reserve(96*num_pairs); @@ -415,7 +415,7 @@ void benchmark_bls_pairing_mont_three_pair() { } // bls_g1_map benchmarking -void benchmark_bls_g1_map_impl(std::string test_name, bool mont) { +void benchmark_bls_g1_map_impl(const std::string& test_name, bool mont) { // prepare e operand. Must be fp LE. std::vector e_buf(48); fp a = random_fe(); @@ -451,7 +451,7 @@ void benchmark_bls_g1_map_mont() { } // bls_g2_map benchmarking -void benchmark_bls_g2_map_impl(std::string test_name, bool mont) { +void benchmark_bls_g2_map_impl(const std::string& test_name, bool mont) { // prepare e operand. Must be fp2 LE. std::vector e_buf(96); fp2 a = random_fe2(); @@ -487,7 +487,7 @@ void benchmark_bls_g2_map_mont() { } // bls_fp_mod benchmarking -void benchmark_bls_fp_mod_impl(std::string test_name, bool mont) { +void benchmark_bls_fp_mod_impl(const std::string& test_name, bool mont) { // prepare scalar operand std::vector scalar_buf(64); // random_scalar returns 32 bytes. need to call it twice @@ -525,7 +525,7 @@ void benchmark_bls_fp_mod_mont() { benchmark_bls_fp_mod_impl("bls_fp_mod_mont", true); } -void benchmark_bls_fp_mul_impl(std::string test_name, bool mont) { +void benchmark_bls_fp_mul_impl(const std::string& test_name, bool mont) { // prepare op1 std::vector op1_buf(48); fp a = random_fe(); @@ -566,7 +566,7 @@ void benchmark_bls_fp_mul_mont() { benchmark_bls_fp_mul_impl("bls_fp_mul_mont", true); } -void benchmark_bls_fp_exp_impl(std::string test_name, bool mont) { +void benchmark_bls_fp_exp_impl(const std::string& test_name, bool mont) { // prepare base std::vector base_buf(48); fp a = random_fe(); From dfb05c5abc15bcdedc8f7cdf50f9874db3f3db65 Mon Sep 17 00:00:00 2001 From: yarkin Date: Thu, 16 Nov 2023 11:15:52 +0800 Subject: [PATCH 14/24] Remove _mont functions. --- libraries/chain/controller.cpp | 11 - .../eos-vm-oc/intrinsic_mapping.hpp | 12 +- .../eosio/chain/webassembly/interface.hpp | 112 ----- libraries/chain/webassembly/crypto.cpp | 402 +++++++----------- .../chain/webassembly/runtimes/eos-vm.cpp | 12 +- 5 files changed, 150 insertions(+), 399 deletions(-) diff --git a/libraries/chain/controller.cpp b/libraries/chain/controller.cpp index 87025b21ea..5ca873b181 100644 --- a/libraries/chain/controller.cpp +++ b/libraries/chain/controller.cpp @@ -3853,17 +3853,6 @@ void controller_impl::on_activation( add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_fp_mod" ); add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_fp_mul" ); add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_fp_exp" ); - add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_g1_add_mont" ); - add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_g2_add_mont" ); - add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_g1_weighted_sum_mont" ); - add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_g2_weighted_sum_mont" ); - add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_pairing_mont" ); - add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_g1_map_mont" ); - add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_g2_map_mont" ); - add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_fp_mod_mont" ); - add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_fp_mul_mont" ); - add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_fp_exp_mont" ); - } ); } diff --git a/libraries/chain/include/eosio/chain/webassembly/eos-vm-oc/intrinsic_mapping.hpp b/libraries/chain/include/eosio/chain/webassembly/eos-vm-oc/intrinsic_mapping.hpp index 2ea5bc5a03..8577ec9958 100644 --- a/libraries/chain/include/eosio/chain/webassembly/eos-vm-oc/intrinsic_mapping.hpp +++ b/libraries/chain/include/eosio/chain/webassembly/eos-vm-oc/intrinsic_mapping.hpp @@ -277,17 +277,7 @@ inline constexpr auto get_intrinsic_table() { "env.bls_g2_map", "env.bls_fp_mod", "env.bls_fp_mul", - "env.bls_fp_exp", - "env.bls_g1_add_mont", - "env.bls_g2_add_mont", - "env.bls_g1_weighted_sum_mont", - "env.bls_g2_weighted_sum_mont", - "env.bls_pairing_mont", - "env.bls_g1_map_mont", - "env.bls_g2_map_mont", - "env.bls_fp_mod_mont", - "env.bls_fp_mul_mont", - "env.bls_fp_exp_mont" + "env.bls_fp_exp" ); } inline constexpr std::size_t find_intrinsic_index(std::string_view hf) { diff --git a/libraries/chain/include/eosio/chain/webassembly/interface.hpp b/libraries/chain/include/eosio/chain/webassembly/interface.hpp index e759d4a1cd..66deb611bd 100644 --- a/libraries/chain/include/eosio/chain/webassembly/interface.hpp +++ b/libraries/chain/include/eosio/chain/webassembly/interface.hpp @@ -1796,17 +1796,6 @@ namespace webassembly { */ int32_t bls_g1_add(span op1, span op2, span result) const; - /** - * Host function for G1 addition on the elliptic curve bls12-381 - * - * @ingroup crypto - * @param op1 - a span containing the first operand G1 point in Montgomery form. - * @param op2 - a span containing the second operand G1 point in Montgomery form. - * @param[out] result - the result op1 + op2 in Montgomery form. - * @return -1 if there was an error 0 otherwise - */ - int32_t bls_g1_add_mont(span op1, span op2, span result) const; - /** * Host function for G2 addition on the elliptic curve bls12-381 * @@ -1818,17 +1807,6 @@ namespace webassembly { */ int32_t bls_g2_add(span op1, span op2, span result) const; - /** - * Host function for G2 addition on the elliptic curve bls12-381 - * - * @ingroup crypto - * @param op1 - a span containing the first operand G2 point in Montgomery form. - * @param op2 - a span containing the second operand G2 point in Montgomery form. - * @param[out] result - the result op1 + op2 in Montgomery form. - * @return -1 if there was an error 0 otherwise - */ - int32_t bls_g2_add_mont(span op1, span op2, span result) const; - /** * Host function for G1 weighted sum (multi-exponentiation) on the elliptic curve bls12-381 * @@ -1841,18 +1819,6 @@ namespace webassembly { */ int32_t bls_g1_weighted_sum(span points, span scalars, const uint32_t n, span result) const; - /** - * Host function for G1 weighted sum (multi-exponentiation) on the elliptic curve bls12-381 - * - * @ingroup crypto - * @param points - a span containing a list of G1 points (P0, P1, P2... Pn) in Montgomery form. - * @param scalars - a span containing a list of scalars (s0, s1, s2... sn). - * @param n - the number of elements in the lists. - * @param[out] result - the result s0 * P0 + s1 * P1 + ... + sn * Pn in Montgomery form. - * @return -1 if there was an error 0 otherwise - */ - int32_t bls_g1_weighted_sum_mont(span points, span scalars, const uint32_t n, span result) const; - /** * Host function for G2 weighted sum (multi-exponentiation) on the elliptic curve bls12-381 * @@ -1865,18 +1831,6 @@ namespace webassembly { */ int32_t bls_g2_weighted_sum(span points, span scalars, const uint32_t n, span result) const; - /** - * Host function for G2 weighted sum (multi-exponentiation) on the elliptic curve bls12-381 - * - * @ingroup crypto - * @param points - a span containing a list of G2 points (P0, P1, P2... Pn) in Montgomery form. - * @param scalars - a span containing a list of scalars (s0, s1, s2... sn). - * @param n - the number of elements in the lists. - * @param[out] result - the result s0 * P0 + s1 * P1 + ... + sn * Pn in Montgomery form. - * @return -1 if there was an error 0 otherwise - */ - int32_t bls_g2_weighted_sum_mont(span points, span scalars, const uint32_t n, span result) const; - /** * Host function to calculate the pairing of (G1, G2) pairs on the elliptic curve bls12-381 * @@ -1889,18 +1843,6 @@ namespace webassembly { */ int32_t bls_pairing(span g1_points, span g2_points, const uint32_t n, span result) const; - /** - * Host function to calculate the pairing of (G1, G2) pairs on the elliptic curve bls12-381 - * - * @ingroup crypto - * @param g1_points - a span containing a list of G1 points (P0, P1, P2... Pn) in Montgomery form. - * @param g2_points - a span containing a list of G2 points (P0, P1, P2... Pn) in Montgomery form. - * @param n - the number of elements in the lists. - * @param[out] result - the result e(g1_0, g2_0) * e(g1_1, g2_1) * ... * e(g1_n, g2_n) in Montgomery form. - * @return -1 if there was an error 0 otherwise - */ - int32_t bls_pairing_mont(span g1_points, span g2_points, const uint32_t n, span result) const; - /** * Host function for mapping fp to G1 on the elliptic curve bls12-381 * @@ -1911,16 +1853,6 @@ namespace webassembly { */ int32_t bls_g1_map(span e, span result) const; - /** - * Host function for mapping fp to G1 on the elliptic curve bls12-381 - * - * @ingroup crypto - * @param e - a span containing the field element fp to be mapped in Montgomery form. - * @param[out] result - the resulting element in G1 in Montgomery form. - * @return -1 if there was an error 0 otherwise - */ - int32_t bls_g1_map_mont(span e, span result) const; - /** * Host function for mapping fp2 to G2 on the elliptic curve bls12-381 * @@ -1931,16 +1863,6 @@ namespace webassembly { */ int32_t bls_g2_map(span e, span result) const; - /** - * Host function for mapping fp2 to G2 on the elliptic curve bls12-381 - * - * @ingroup crypto - * @param e - a span containing the field element fp2 to be mapped in Montgomery form. - * @param[out] result - the resulting element in G2 in Montgomery form. - * @return -1 if there was an error 0 otherwise - */ - int32_t bls_g2_map_mont(span e, span result) const; - /** * Host function for modular reduction of 64 bytes wide scalar to a field element (fp, 48 bytes) of the elliptic curve bls12-381 * @@ -1951,17 +1873,6 @@ namespace webassembly { */ int32_t bls_fp_mod(span s, span result) const; - /** - * Host function for modular reduction of 64 bytes wide scalar to a field element (fp, 48 bytes) of the elliptic curve bls12-381 - * Involves Montgomery conversion on the resulting field element. - * - * @ingroup crypto - * @param s - a span containing the 64 bytes wide scalar to be reduced. - * @param[out] result - the resulting field element fp in Montogomery form. - * @return -1 if there was an error 0 otherwise - */ - int32_t bls_fp_mod_mont(span s, span result) const; - /** * Host function for multiplication of field elements (fp, 48 bytes) of the elliptic curve bls12-381 * @@ -1973,18 +1884,6 @@ namespace webassembly { */ int32_t bls_fp_mul(span op1, span op2, span result) const; - /** - * Host function for multiplication of field elements (fp, 48 bytes) of the elliptic curve bls12-381 - * Involves Montgomery conversion on the resulting field element. - * - * @ingroup crypto - * @param op1 - a span containing the first operand fp point in Montgomery form. - * @param op2 - a span containing the second operand fp point in Montgomery form. - * @param[out] result - the result op1 + op2 in Montgomery form. - * @return -1 if there was an error 0 otherwise - */ - int32_t bls_fp_mul_mont(span op1, span op2, span result) const; - /** * Host function for exponentiation of field elements (fp, 48 bytes) of the elliptic curve bls12-381 * @@ -1996,17 +1895,6 @@ namespace webassembly { */ int32_t bls_fp_exp(span base, span exp, span result) const; - /** - * Host function for exponentiation of field elements (fp, 48 bytes) of the elliptic curve bls12-381 - * - * @ingroup crypto - * @param base - a span containing the base fp point in Montgomery form. - * @param exp - a span containing the 64 bytes wide scalar as exponent. - * @param[out] result - the result of base to the power of exp in Montgomery form. - * @return -1 if there was an error 0 otherwise - */ - int32_t bls_fp_exp_mont(span base, span exp, span result) const; - // compiler builtins api void __ashlti3(legacy_ptr, uint64_t, uint64_t, uint32_t) const; void __ashrti3(legacy_ptr, uint64_t, uint64_t, uint32_t) const; diff --git a/libraries/chain/webassembly/crypto.cpp b/libraries/chain/webassembly/crypto.cpp index 68555af367..2ffdb7b5ac 100644 --- a/libraries/chain/webassembly/crypto.cpp +++ b/libraries/chain/webassembly/crypto.cpp @@ -26,185 +26,7 @@ namespace { using eosio::chain::span; using eosio::chain::webassembly::return_code; - int32_t bls_g1_add_impl(span op1, span op2, span result, bool mont) { - if(op1.size() != 96 || op2.size() != 96 || result.size() != 96) - return return_code::failure; - std::optional a = bls12_381::g1::fromAffineBytesLE(std::span((const uint8_t*)op1.data(), 96), true, mont); - std::optional b = bls12_381::g1::fromAffineBytesLE(std::span((const uint8_t*)op2.data(), 96), true, mont); - if(!a || !b) - return return_code::failure; - bls12_381::g1 c = a->add(*b); - c.toAffineBytesLE(std::span((uint8_t*)result.data(), 96), mont); - return return_code::success; - } - - int32_t bls_g2_add_impl(span op1, span op2, span result, bool mont) - { - if(op1.size() != 192 || op2.size() != 192 || result.size() != 192) - return return_code::failure; - std::optional a = bls12_381::g2::fromAffineBytesLE(std::span((const uint8_t*)op1.data(), 192), true, mont); - std::optional b = bls12_381::g2::fromAffineBytesLE(std::span((const uint8_t*)op2.data(), 192), true, mont); - if(!a || !b) - return return_code::failure; - bls12_381::g2 c = a->add(*b); - c.toAffineBytesLE(std::span((uint8_t*)result.data(), 192), mont); - return return_code::success; - } - - int32_t bls_g1_weighted_sum_impl(span points, span scalars, const uint32_t n, span result, const std::function& yield, bool mont) - { - if(points.size() != n*96 || scalars.size() != n*32 || result.size() != 96) - return return_code::failure; - - // Use much efficient scale for the special case of n == 1. - if (1 == n) { - std::optional a = bls12_381::g1::fromAffineBytesLE(std::span((const uint8_t*)points.data(), 96), true, mont); - if(!a) - return return_code::failure; - std::array b = bls12_381::scalar::fromBytesLE<4>(std::span((uint8_t*)scalars.data(), 32)); - bls12_381::g1 c = a->scale(b); - c.toAffineBytesLE(std::span((uint8_t*)result.data(), 96), mont); - return return_code::success; - } - - std::vector pv; - std::vector> sv; - pv.reserve(n); - sv.reserve(n); - for(uint32_t i = 0; i < n; i++) - { - std::optional p = bls12_381::g1::fromAffineBytesLE(std::span((const uint8_t*)points.data() + i*96, 96), true, mont); - if(!p.has_value()) - return return_code::failure; - std::array s = bls12_381::scalar::fromBytesLE<4>(std::span((const uint8_t*)scalars.data() + i*32, 32)); - pv.push_back(p.value()); - sv.push_back(s); - if(i%10 == 0) - yield(); - } - bls12_381::g1 r = bls12_381::g1::weightedSum(pv, sv, yield); // accessing value is safe - r.toAffineBytesLE(std::span((uint8_t*)result.data(), 96), mont); - return return_code::success; - } - - int32_t bls_g2_weighted_sum_impl(span points, span scalars, const uint32_t n, span result, const std::function& yield, bool mont) - { - if(points.size() != n*192 || scalars.size() != n*32 || result.size() != 192) - return return_code::failure; - - // Use much efficient scale for the special case of n == 1. - if (1 == n) { - std::optional a = bls12_381::g2::fromAffineBytesLE(std::span((const uint8_t*)points.data(), 192), true, mont); - if(!a) - return return_code::failure; - std::array b = bls12_381::scalar::fromBytesLE<4>(std::span((uint8_t*)scalars.data(), 32)); - bls12_381::g2 c = a->scale(b); - c.toAffineBytesLE(std::span((uint8_t*)result.data(), 192), mont); - return return_code::success; - } - - std::vector pv; - std::vector> sv; - pv.reserve(n); - sv.reserve(n); - for(uint32_t i = 0; i < n; i++) - { - std::optional p = bls12_381::g2::fromAffineBytesLE(std::span((const uint8_t*)points.data() + i*192, 192), true, mont); - if(!p) - return return_code::failure; - std::array s = bls12_381::scalar::fromBytesLE<4>(std::span((const uint8_t*)scalars.data() + i*32, 32)); - pv.push_back(*p); - sv.push_back(s); - if(i%6 == 0) - yield(); - } - bls12_381::g2 r = bls12_381::g2::weightedSum(pv, sv, yield); // accessing value is safe - r.toAffineBytesLE(std::span((uint8_t*)result.data(), 192), mont); - return return_code::success; - } - - int32_t bls_pairing_impl(span g1_points, span g2_points, const uint32_t n, span result, const std::function& yield, bool mont) - { - if(g1_points.size() != n*96 || g2_points.size() != n*192 || result.size() != 576) - return return_code::failure; - std::vector> v; - v.reserve(n); - for(uint32_t i = 0; i < n; i++) - { - std::optional p_g1 = bls12_381::g1::fromAffineBytesLE(std::span((const uint8_t*)g1_points.data() + i*96, 96), true, mont); - std::optional p_g2 = bls12_381::g2::fromAffineBytesLE(std::span((const uint8_t*)g2_points.data() + i*192, 192), true, mont); - if(!p_g1 || !p_g2) - return return_code::failure; - bls12_381::pairing::add_pair(v, *p_g1, *p_g2); - if(i%4 == 0) - yield(); - } - bls12_381::fp12 r = bls12_381::pairing::calculate(v, yield); - r.toBytesLE(std::span((uint8_t*)result.data(), 576), mont); - return return_code::success; - } - - int32_t bls_g1_map_impl(span e, span result, bool mont) - { - if(e.size() != 48 || result.size() != 96) - return return_code::failure; - std::optional a = bls12_381::fp::fromBytesLE(std::span((const uint8_t*)e.data(), 48), true, mont); - if(!a) - return return_code::failure; - bls12_381::g1 c = bls12_381::g1::mapToCurve(*a); - c.toAffineBytesLE(std::span((uint8_t*)result.data(), 96), mont); - return return_code::success; - } - - int32_t bls_g2_map_impl(span e, span result, bool mont) - { - if(e.size() != 96 || result.size() != 192) - return return_code::failure; - std::optional a = bls12_381::fp2::fromBytesLE(std::span((const uint8_t*)e.data(), 96), true, mont); - if(!a) - return return_code::failure; - bls12_381::g2 c = bls12_381::g2::mapToCurve(*a); - c.toAffineBytesLE(std::span((uint8_t*)result.data(), 192), mont); - return return_code::success; - } - - int32_t bls_fp_mod_impl(span s, span result, bool mont) - { - // s is scalar. - if(s.size() != 64 || result.size() != 48) - return return_code::failure; - std::array k = bls12_381::scalar::fromBytesLE<8>(std::span((const uint8_t*)s.data(), 64)); - bls12_381::fp e = bls12_381::fp::modPrime<8>(k); - e.toBytesLE(std::span((uint8_t*)result.data(), 48), mont); - return return_code::success; - } - - int32_t bls_fp_mul_impl(span op1, span op2, span result, bool mont) - { - if(op1.size() != 48 || op2.size() != 48 || result.size() != 48) - return return_code::failure; - std::optional a = bls12_381::fp::fromBytesLE(std::span((const uint8_t*)op1.data(), 48), true, mont); - std::optional b = bls12_381::fp::fromBytesLE(std::span((const uint8_t*)op2.data(), 48), true, mont); - if(!a || !b) - return return_code::failure; - bls12_381::fp c = a->multiply(*b); - c.toBytesLE(std::span((uint8_t*)result.data(), 48), mont); - return return_code::success; - } - - int32_t bls_fp_exp_impl(span base, span exp, span result, bool mont) - { - // exp is scalar. - if(base.size() != 48 || exp.size() != 64 || result.size() != 48) - return return_code::failure; - std::optional a = bls12_381::fp::fromBytesLE(std::span((const uint8_t*)base.data(), 48), true, mont); - if(!a) - return return_code::failure; - std::array b = bls12_381::scalar::fromBytesLE<8>(std::span((const uint8_t*)exp.data(), 64)); - bls12_381::fp c = a->exp<8>(b); - c.toBytesLE(std::span((uint8_t*)result.data(), 48), mont); - return return_code::success; - } + } @@ -440,103 +262,175 @@ namespace eosio { namespace chain { namespace webassembly { return return_code::success; } - int32_t interface::bls_g1_add(span op1, span op2, span result) const - { - return bls_g1_add_impl(op1, op2, result, false); - } - - int32_t interface::bls_g1_add_mont(span op1, span op2, span result) const - { - return bls_g1_add_impl(op1, op2, result, true); - } - - int32_t interface::bls_g2_add(span op1, span op2, span result) const - { - return bls_g2_add_impl(op1, op2, result, false); - } - - int32_t interface::bls_g2_add_mont(span op1, span op2, span result) const - { - return bls_g2_add_impl(op1, op2, result, true); - } - - int32_t interface::bls_g1_weighted_sum(span points, span scalars, const uint32_t n, span result) const - { - return bls_g1_weighted_sum_impl(points, scalars, n, result, [this](){ context.trx_context.checktime(); }, false); - } - int32_t interface::bls_g1_weighted_sum_mont(span points, span scalars, const uint32_t n, span result) const - { - return bls_g1_weighted_sum_impl(points, scalars, n, result, [this](){ context.trx_context.checktime(); }, true); + int32_t interface::bls_g1_add(span op1, span op2, span result) const { + if(op1.size() != 96 || op2.size() != 96 || result.size() != 96) + return return_code::failure; + std::optional a = bls12_381::g1::fromAffineBytesLE(std::span((const uint8_t*)op1.data(), 96), true, false); + std::optional b = bls12_381::g1::fromAffineBytesLE(std::span((const uint8_t*)op2.data(), 96), true, false); + if(!a || !b) + return return_code::failure; + bls12_381::g1 c = a->add(*b); + c.toAffineBytesLE(std::span((uint8_t*)result.data(), 96), false); + return return_code::success; } - int32_t interface::bls_g2_weighted_sum(span points, span scalars, const uint32_t n, span result) const - { - return bls_g2_weighted_sum_impl(points, scalars, n, result, [this](){ context.trx_context.checktime(); }, false); + int32_t interface::bls_g2_add(span op1, span op2, span result) const { + if(op1.size() != 192 || op2.size() != 192 || result.size() != 192) + return return_code::failure; + std::optional a = bls12_381::g2::fromAffineBytesLE(std::span((const uint8_t*)op1.data(), 192), true, false); + std::optional b = bls12_381::g2::fromAffineBytesLE(std::span((const uint8_t*)op2.data(), 192), true, false); + if(!a || !b) + return return_code::failure; + bls12_381::g2 c = a->add(*b); + c.toAffineBytesLE(std::span((uint8_t*)result.data(), 192), false); + return return_code::success; } - int32_t interface::bls_g2_weighted_sum_mont(span points, span scalars, const uint32_t n, span result) const - { - return bls_g2_weighted_sum_impl(points, scalars, n, result, [this](){ context.trx_context.checktime(); }, true); - } + int32_t interface::bls_g1_weighted_sum(span points, span scalars, const uint32_t n, span result) const { + if(points.size() != n*96 || scalars.size() != n*32 || result.size() != 96) + return return_code::failure; - int32_t interface::bls_pairing(span g1_points, span g2_points, const uint32_t n, span result) const - { - return bls_pairing_impl(g1_points, g2_points, n, result, [this](){ context.trx_context.checktime(); }, false); - } + // Use much efficient scale for the special case of n == 1. + if (1 == n) { + std::optional a = bls12_381::g1::fromAffineBytesLE(std::span((const uint8_t*)points.data(), 96), true, false); + if(!a) + return return_code::failure; + std::array b = bls12_381::scalar::fromBytesLE<4>(std::span((uint8_t*)scalars.data(), 32)); + bls12_381::g1 c = a->scale(b); + c.toAffineBytesLE(std::span((uint8_t*)result.data(), 96), false); + return return_code::success; + } - int32_t interface::bls_pairing_mont(span g1_points, span g2_points, const uint32_t n, span result) const - { - return bls_pairing_impl(g1_points, g2_points, n, result, [this](){ context.trx_context.checktime(); }, true); + std::vector pv; + std::vector> sv; + pv.reserve(n); + sv.reserve(n); + for(uint32_t i = 0; i < n; i++) + { + std::optional p = bls12_381::g1::fromAffineBytesLE(std::span((const uint8_t*)points.data() + i*96, 96), true, false); + if(!p.has_value()) + return return_code::failure; + std::array s = bls12_381::scalar::fromBytesLE<4>(std::span((const uint8_t*)scalars.data() + i*32, 32)); + pv.push_back(p.value()); + sv.push_back(s); + if(i%10 == 0) + context.trx_context.checktime(); + } + bls12_381::g1 r = bls12_381::g1::weightedSum(pv, sv, [this](){ context.trx_context.checktime();}); // accessing value is safe + r.toAffineBytesLE(std::span((uint8_t*)result.data(), 96), false); + return return_code::success; } - int32_t interface::bls_g1_map(span e, span result) const - { - return bls_g1_map_impl(e, result, false); - } + int32_t interface::bls_g2_weighted_sum(span points, span scalars, const uint32_t n, span result) const { + if(points.size() != n*192 || scalars.size() != n*32 || result.size() != 192) + return return_code::failure; - int32_t interface::bls_g1_map_mont(span e, span result) const - { - return bls_g1_map_impl(e, result, true); - } + // Use much efficient scale for the special case of n == 1. + if (1 == n) { + std::optional a = bls12_381::g2::fromAffineBytesLE(std::span((const uint8_t*)points.data(), 192), true, false); + if(!a) + return return_code::failure; + std::array b = bls12_381::scalar::fromBytesLE<4>(std::span((uint8_t*)scalars.data(), 32)); + bls12_381::g2 c = a->scale(b); + c.toAffineBytesLE(std::span((uint8_t*)result.data(), 192), false); + return return_code::success; + } - int32_t interface::bls_g2_map(span e, span result) const - { - return bls_g2_map_impl(e, result, false); + std::vector pv; + std::vector> sv; + pv.reserve(n); + sv.reserve(n); + for(uint32_t i = 0; i < n; i++) + { + std::optional p = bls12_381::g2::fromAffineBytesLE(std::span((const uint8_t*)points.data() + i*192, 192), true, false); + if(!p) + return return_code::failure; + std::array s = bls12_381::scalar::fromBytesLE<4>(std::span((const uint8_t*)scalars.data() + i*32, 32)); + pv.push_back(*p); + sv.push_back(s); + if(i%6 == 0) + context.trx_context.checktime(); + } + bls12_381::g2 r = bls12_381::g2::weightedSum(pv, sv, [this](){ context.trx_context.checktime();}); // accessing value is safe + r.toAffineBytesLE(std::span((uint8_t*)result.data(), 192), false); + return return_code::success; } - int32_t interface::bls_g2_map_mont(span e, span result) const - { - return bls_g2_map_impl(e, result, true); + int32_t interface::bls_pairing(span g1_points, span g2_points, const uint32_t n, span result) const { + if(g1_points.size() != n*96 || g2_points.size() != n*192 || result.size() != 576) + return return_code::failure; + std::vector> v; + v.reserve(n); + for(uint32_t i = 0; i < n; i++) + { + std::optional p_g1 = bls12_381::g1::fromAffineBytesLE(std::span((const uint8_t*)g1_points.data() + i*96, 96), true, false); + std::optional p_g2 = bls12_381::g2::fromAffineBytesLE(std::span((const uint8_t*)g2_points.data() + i*192, 192), true, false); + if(!p_g1 || !p_g2) + return return_code::failure; + bls12_381::pairing::add_pair(v, *p_g1, *p_g2); + if(i%4 == 0) + context.trx_context.checktime(); + } + bls12_381::fp12 r = bls12_381::pairing::calculate(v, [this](){ context.trx_context.checktime();}); + r.toBytesLE(std::span((uint8_t*)result.data(), 576), false); + return return_code::success; } - int32_t interface::bls_fp_mod(span s, span result) const - { - return bls_fp_mod_impl(s, result, false); + int32_t interface::bls_g1_map(span e, span result) const { + if(e.size() != 48 || result.size() != 96) + return return_code::failure; + std::optional a = bls12_381::fp::fromBytesLE(std::span((const uint8_t*)e.data(), 48), true, false); + if(!a) + return return_code::failure; + bls12_381::g1 c = bls12_381::g1::mapToCurve(*a); + c.toAffineBytesLE(std::span((uint8_t*)result.data(), 96), false); + return return_code::success; } - int32_t interface::bls_fp_mod_mont(span s, span result) const - { - return bls_fp_mod_impl(s, result, true); + int32_t interface::bls_g2_map(span e, span result) const { + if(e.size() != 96 || result.size() != 192) + return return_code::failure; + std::optional a = bls12_381::fp2::fromBytesLE(std::span((const uint8_t*)e.data(), 96), true, false); + if(!a) + return return_code::failure; + bls12_381::g2 c = bls12_381::g2::mapToCurve(*a); + c.toAffineBytesLE(std::span((uint8_t*)result.data(), 192), false); + return return_code::success; } - int32_t interface::bls_fp_mul(span op1, span op2, span result) const - { - return bls_fp_mul_impl(op1, op2, result, false); + int32_t interface::bls_fp_mod(span s, span result) const { + // s is scalar. + if(s.size() != 64 || result.size() != 48) + return return_code::failure; + std::array k = bls12_381::scalar::fromBytesLE<8>(std::span((const uint8_t*)s.data(), 64)); + bls12_381::fp e = bls12_381::fp::modPrime<8>(k); + e.toBytesLE(std::span((uint8_t*)result.data(), 48), false); + return return_code::success; } - int32_t interface::bls_fp_mul_mont(span op1, span op2, span result) const - { - return bls_fp_mul_impl(op1, op2, result, true); + int32_t interface::bls_fp_mul(span op1, span op2, span result) const { + if(op1.size() != 48 || op2.size() != 48 || result.size() != 48) + return return_code::failure; + std::optional a = bls12_381::fp::fromBytesLE(std::span((const uint8_t*)op1.data(), 48), true, false); + std::optional b = bls12_381::fp::fromBytesLE(std::span((const uint8_t*)op2.data(), 48), true, false); + if(!a || !b) + return return_code::failure; + bls12_381::fp c = a->multiply(*b); + c.toBytesLE(std::span((uint8_t*)result.data(), 48), false); + return return_code::success; } - int32_t interface::bls_fp_exp(span base, span exp, span result) const - { - return bls_fp_exp_impl(base, exp, result, false); + int32_t interface::bls_fp_exp(span base, span exp, span result) const { + // exp is scalar. + if(base.size() != 48 || exp.size() != 64 || result.size() != 48) + return return_code::failure; + std::optional a = bls12_381::fp::fromBytesLE(std::span((const uint8_t*)base.data(), 48), true, false); + if(!a) + return return_code::failure; + std::array b = bls12_381::scalar::fromBytesLE<8>(std::span((const uint8_t*)exp.data(), 64)); + bls12_381::fp c = a->exp<8>(b); + c.toBytesLE(std::span((uint8_t*)result.data(), 48), false); + return return_code::success; } - int32_t interface::bls_fp_exp_mont(span base, span exp, span result) const - { - return bls_fp_exp_impl(base, exp, result, true); - } - }}} // ns eosio::chain::webassembly diff --git a/libraries/chain/webassembly/runtimes/eos-vm.cpp b/libraries/chain/webassembly/runtimes/eos-vm.cpp index 384d3e112f..3a41448c19 100644 --- a/libraries/chain/webassembly/runtimes/eos-vm.cpp +++ b/libraries/chain/webassembly/runtimes/eos-vm.cpp @@ -647,17 +647,7 @@ REGISTER_CF_HOST_FUNCTION( bls_g1_map ); REGISTER_CF_HOST_FUNCTION( bls_g2_map ); REGISTER_CF_HOST_FUNCTION( bls_fp_mod ); REGISTER_CF_HOST_FUNCTION( bls_fp_mul ); -REGISTER_CF_HOST_FUNCTION( bls_fp_exp ); -REGISTER_CF_HOST_FUNCTION( bls_g1_add_mont ); -REGISTER_CF_HOST_FUNCTION( bls_g2_add_mont ); -REGISTER_CF_HOST_FUNCTION( bls_g1_weighted_sum_mont ); -REGISTER_CF_HOST_FUNCTION( bls_g2_weighted_sum_mont ); -REGISTER_CF_HOST_FUNCTION( bls_pairing_mont ); -REGISTER_CF_HOST_FUNCTION( bls_g1_map_mont ); -REGISTER_CF_HOST_FUNCTION( bls_g2_map_mont ); -REGISTER_CF_HOST_FUNCTION( bls_fp_mod_mont ); -REGISTER_CF_HOST_FUNCTION( bls_fp_mul_mont ); -REGISTER_CF_HOST_FUNCTION( bls_fp_exp_mont ); +REGISTER_CF_HOST_FUNCTION( bls_fp_exp ); } // namespace webassembly } // namespace chain From e1f67e9374607aae22f132c6c76a92582a987e31 Mon Sep 17 00:00:00 2001 From: yarkin Date: Thu, 16 Nov 2023 13:34:15 +0800 Subject: [PATCH 15/24] Update comments. --- .../eosio/chain/webassembly/interface.hpp | 78 +++++++++---------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/libraries/chain/include/eosio/chain/webassembly/interface.hpp b/libraries/chain/include/eosio/chain/webassembly/interface.hpp index 66deb611bd..e138e18e84 100644 --- a/libraries/chain/include/eosio/chain/webassembly/interface.hpp +++ b/libraries/chain/include/eosio/chain/webassembly/interface.hpp @@ -1707,7 +1707,7 @@ namespace webassembly { * @param op1 - a span containing the first operand G1 point. * @param op2 - a span containing the second operand G1 point. * @param[out] result - the result op1 + op2. - * @return -1 if there was an error 0 otherwise + * @return -1 if there was an error, 0 otherwise */ int32_t alt_bn128_add(span op1, span op2, span result) const; @@ -1718,7 +1718,7 @@ namespace webassembly { * @param g1_point - a span containing G1 point. * @param scalar - a span containing the scalar. * @param[out] result - g1 * scalar. - * @return -1 if there was an error 0 otherwise + * @return -1 if there was an error, 0 otherwise */ int32_t alt_bn128_mul(span g1_point, span scalar, span result) const; @@ -1742,7 +1742,7 @@ namespace webassembly { * @param exp - a span containing EXPONENT. * @param modulus - a span containing MODULUS. * @param[out] out - the result (BASE**EXPONENT) % MODULUS - * @return -1 if there was an error 0 otherwise + * @return -1 if there was an error, 0 otherwise */ int32_t mod_exp(span base, span exp, span modulus, span out) const; @@ -1759,7 +1759,7 @@ namespace webassembly { * @param t1_offset - offset counters - unsigned 64-bit little-endian word * @param final - the final block indicator flag - (1-true, all other values == false) * @param[out] result - the result - * @return -1 if there was an error 0 otherwise + * @return -1 if there was an error, 0 otherwise */ int32_t blake2_f( uint32_t rounds, span state, span message, span t0_offset, span t1_offset, int32_t final, span result) const; @@ -1781,7 +1781,7 @@ namespace webassembly { * @param digest - digest of the message that was signed. * @param[out] pub - output buffer for the public key result. * - * @return -1 if there was an error 0 otherwise. + * @return -1 if there was an error, 0 otherwise. */ int32_t k1_recover( span signature, span digest, span pub) const; @@ -1789,10 +1789,10 @@ namespace webassembly { * Host function for G1 addition on the elliptic curve bls12-381 * * @ingroup crypto - * @param op1 - a span containing the first operand G1 point. - * @param op2 - a span containing the second operand G1 point. - * @param[out] result - the result op1 + op2. - * @return -1 if there was an error 0 otherwise + * @param op1 - a span containing the affine coordingates of the first operand G1 point - 96 bytes little-endian. + * @param op2 - a span containing the affine coordingates of the second operand G1 point - 96 bytes little-endian. + * @param[out] result - the result op1 + op2 - 96 bytes little-endian. + * @return -1 if there was an error, 0 otherwise */ int32_t bls_g1_add(span op1, span op2, span result) const; @@ -1800,10 +1800,10 @@ namespace webassembly { * Host function for G2 addition on the elliptic curve bls12-381 * * @ingroup crypto - * @param op1 - a span containing the first operand G2 point. - * @param op2 - a span containing the second operand G2 point. - * @param[out] result - the result op1 + op2. - * @return -1 if there was an error 0 otherwise + * @param op1 - a span containing the affine coordingates of the first operand G2 point - 192 bytes little-endian. + * @param op2 - a span containing the affine coordingates of the second operand G2 point - 192 bytes little-endian. + * @param[out] result - the result op1 + op2 - 192 bytes little-endian. + * @return -1 if there was an error, 0 otherwise */ int32_t bls_g2_add(span op1, span op2, span result) const; @@ -1811,11 +1811,11 @@ namespace webassembly { * Host function for G1 weighted sum (multi-exponentiation) on the elliptic curve bls12-381 * * @ingroup crypto - * @param points - a span containing a list of G1 points (P0, P1, P2... Pn). - * @param scalars - a span containing a list of scalars (s0, s1, s2... sn). + * @param points - a span containing a list of G1 points (P0, P1, P2... Pn) - 96*n bytes little-endian. + * @param scalars - a span containing a list of 32 byte scalars (s0, s1, s2... sn) - 32*n bytes little-endian. * @param n - the number of elements in the lists. * @param[out] result - the result s0 * P0 + s1 * P1 + ... + sn * Pn. - * @return -1 if there was an error 0 otherwise + * @return -1 if there was an error, 0 otherwise */ int32_t bls_g1_weighted_sum(span points, span scalars, const uint32_t n, span result) const; @@ -1823,11 +1823,11 @@ namespace webassembly { * Host function for G2 weighted sum (multi-exponentiation) on the elliptic curve bls12-381 * * @ingroup crypto - * @param points - a span containing a list of G2 points (P0, P1, P2... Pn). - * @param scalars - a span containing a list of scalars (s0, s1, s2... sn). + * @param points - a span containing a list of G2 points (P0, P1, P2... Pn) - 192*n bytes little-endian. + * @param scalars - a span containing a list of 32 byte scalars (s0, s1, s2... sn) - 32*n bytes little-endian. * @param n - the number of elements in the lists. - * @param[out] result - the result s0 * P0 + s1 * P1 + ... + sn * Pn. - * @return -1 if there was an error 0 otherwise + * @param[out] result - the result s0 * P0 + s1 * P1 + ... + sn * Pn - 192 bytes little-endian. + * @return -1 if there was an error, 0 otherwise */ int32_t bls_g2_weighted_sum(span points, span scalars, const uint32_t n, span result) const; @@ -1835,11 +1835,11 @@ namespace webassembly { * Host function to calculate the pairing of (G1, G2) pairs on the elliptic curve bls12-381 * * @ingroup crypto - * @param g1_points - a span containing a list of G1 points (P0, P1, P2... Pn). - * @param g2_points - a span containing a list of G2 points (P0, P1, P2... Pn). + * @param g1_points - a span containing a list of G1 points (P0, P1, P2... Pn) - 96*n bytes little-endian. + * @param g2_points - a span containing a list of G2 points (P0, P1, P2... Pn) - 192*n bytes little-endian.. * @param n - the number of elements in the lists. - * @param[out] result - the result e(g1_0, g2_0) * e(g1_1, g2_1) * ... * e(g1_n, g2_n) - * @return -1 if there was an error 0 otherwise + * @param[out] result - the result e(g1_0, g2_0) * e(g1_1, g2_1) * ... * e(g1_n, g2_n) - 576 bytes little-endian. + * @return -1 if there was an error, 0 otherwise */ int32_t bls_pairing(span g1_points, span g2_points, const uint32_t n, span result) const; @@ -1847,9 +1847,9 @@ namespace webassembly { * Host function for mapping fp to G1 on the elliptic curve bls12-381 * * @ingroup crypto - * @param e - a span containing the field element fp to be mapped. - * @param[out] result - the resulting element in G1. - * @return -1 if there was an error 0 otherwise + * @param e - a span containing the field element fp to be mapped - 48 bytes little-endian. + * @param[out] result - the resulting element in G1 - 96 bytes little-endian. + * @return -1 if there was an error, 0 otherwise */ int32_t bls_g1_map(span e, span result) const; @@ -1857,9 +1857,9 @@ namespace webassembly { * Host function for mapping fp2 to G2 on the elliptic curve bls12-381 * * @ingroup crypto - * @param e - a span containing the field element fp2 to be mapped. - * @param[out] result - the resulting element in G2. - * @return -1 if there was an error 0 otherwise + * @param e - a span containing the field element fp2 to be mapped - 96 bytes little-endian. + * @param[out] result - the resulting element in G2 - 192 bytes little-endian. + * @return -1 if there was an error, 0 otherwise */ int32_t bls_g2_map(span e, span result) const; @@ -1868,8 +1868,8 @@ namespace webassembly { * * @ingroup crypto * @param s - a span containing the 64 bytes wide scalar to be reduced. - * @param[out] result - the resulting field element fp. - * @return -1 if there was an error 0 otherwise + * @param[out] result - the resulting field element fp - 48 bytes little-endian. + * @return -1 if there was an error, 0 otherwise */ int32_t bls_fp_mod(span s, span result) const; @@ -1877,10 +1877,10 @@ namespace webassembly { * Host function for multiplication of field elements (fp, 48 bytes) of the elliptic curve bls12-381 * * @ingroup crypto - * @param op1 - a span containing the first operand fp point. - * @param op2 - a span containing the second operand fp point. - * @param[out] result - the result op1 * op2. - * @return -1 if there was an error 0 otherwise + * @param op1 - a span containing the first operand fp point - 48 bytes little-endian. + * @param op2 - a span containing the second operand fp point - 48 bytes little-endian. + * @param[out] result - the result op1 * op2 - 48 bytes little-endian. + * @return -1 if there was an error, 0 otherwise */ int32_t bls_fp_mul(span op1, span op2, span result) const; @@ -1888,10 +1888,10 @@ namespace webassembly { * Host function for exponentiation of field elements (fp, 48 bytes) of the elliptic curve bls12-381 * * @ingroup crypto - * @param base - a span containing the base fp point. + * @param base - a span containing the base fp point - 48 bytes little-endian. * @param exp - a span containing the 64 bytes wide scalar as exponent. - * @param[out] result - the result of base to the power of exp. - * @return -1 if there was an error 0 otherwise + * @param[out] result - the result of base to the power of exp - 48 bytes little-endian. + * @return -1 if there was an error, 0 otherwise */ int32_t bls_fp_exp(span base, span exp, span result) const; From d9e59b8d6285cd38d13245df549af3e393a3208c Mon Sep 17 00:00:00 2001 From: yarkin Date: Thu, 16 Nov 2023 13:38:27 +0800 Subject: [PATCH 16/24] Delete unused benchmark. --- benchmark/bls.cpp | 55 ----------------------------------------------- 1 file changed, 55 deletions(-) diff --git a/benchmark/bls.cpp b/benchmark/bls.cpp index fe03a66ccb..abcf78af2c 100644 --- a/benchmark/bls.cpp +++ b/benchmark/bls.cpp @@ -162,60 +162,7 @@ void benchmark_bls_g2_add() { benchmarking("bls_g2_add", benchmarked_func); } -/* -// bls_g1_mul benchmarking -void benchmark_bls_g1_mul() { - // prepare g1 operand - g1 p = random_g1(); - std::vector buf(96); - p.toAffineBytesLE(std::span((uint8_t*)buf.data(), 96), true); - eosio::chain::span point(buf.data(), buf.size()); - - // prepare scalar operand - std::array s = random_scalar(); - std::vector scalar_buf(32); - scalar::toBytesLE(s, std::span((uint8_t*)scalar_buf.data(), 32)); - eosio::chain::span scalar(scalar_buf.data(), scalar_buf.size()); - - // prepare result operand - std::vector result_buf(96); - eosio::chain::span result(result_buf.data(), result_buf.size()); - - // set up bls_g1_mul to be benchmarked - interface_in_benchmark interface; - auto benchmarked_func = [&]() { - interface.interface->bls_g1_mul(point, scalar, result); - }; - - benchmarking("bls_g1_mul", benchmarked_func); -} -// bls_g2_mul benchmarking -void benchmark_bls_g2_mul() { - g2 p = random_g2(); - std::vector buf(192); - p.toAffineBytesLE(std::span((uint8_t*)buf.data(), 192), true); - eosio::chain::span point(buf.data(), buf.size()); - - // prepare scalar operand - std::array s = random_scalar(); - std::vector scalar_buf(32); - scalar::toBytesLE(s, std::span((uint8_t*)scalar_buf.data(), 32)); - eosio::chain::span scalar(scalar_buf.data(), scalar_buf.size()); - - // prepare result operand - std::vector result_buf(192); - eosio::chain::span result(result_buf.data(), result_buf.size()); - - // set up bls_g2_mul to be benchmarked - interface_in_benchmark interface; - auto benchmarked_func = [&]() { - interface.interface->bls_g2_mul(point, scalar, result); - }; - - benchmarking("bls_g2_mul", benchmarked_func); -} -*/ // bls_g1_weighted_sum benchmarking utility void benchmark_bls_g1_weighted_sum(std::string test_name, uint32_t num_points) { // prepare g1 points operand @@ -406,8 +353,6 @@ void benchmark_bls_fp_mod() { void bls_benchmarking() { benchmark_bls_g1_add(); benchmark_bls_g2_add(); - // benchmark_bls_g1_mul(); - // benchmark_bls_g2_mul(); benchmark_bls_pairing_one_pair(); benchmark_bls_pairing_three_pair(); benchmark_bls_g1_weighted_sum_one_point(); From 65b54ab2eeb59ac381ed78463badcb83779e61cb Mon Sep 17 00:00:00 2001 From: Lin Huang Date: Thu, 16 Nov 2023 09:29:43 -0500 Subject: [PATCH 17/24] resolve merge conflicts --- benchmark/bls.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/benchmark/bls.cpp b/benchmark/bls.cpp index 9906b6402e..6eb19c8de7 100644 --- a/benchmark/bls.cpp +++ b/benchmark/bls.cpp @@ -619,10 +619,7 @@ void bls_benchmarking() { benchmark_bls_g1_add(); benchmark_bls_g1_add_mont(); benchmark_bls_g2_add(); -<<<<<<< HEAD benchmark_bls_g2_add_mont(); -======= ->>>>>>> origin/yarkin/update_bls benchmark_bls_pairing_one_pair(); benchmark_bls_pairing_mont_one_pair(); benchmark_bls_pairing_three_pair(); From c39e930491c2345dd175aec12d6d7abc26fc7e03 Mon Sep 17 00:00:00 2001 From: Lin Huang Date: Thu, 16 Nov 2023 09:59:34 -0500 Subject: [PATCH 18/24] remove _mont* functions --- benchmark/bls.cpp | 319 ++++++++++------------------------------------ 1 file changed, 67 insertions(+), 252 deletions(-) diff --git a/benchmark/bls.cpp b/benchmark/bls.cpp index 6eb19c8de7..2b83069145 100644 --- a/benchmark/bls.cpp +++ b/benchmark/bls.cpp @@ -148,12 +148,12 @@ bls12_381::g2 random_g2() } // bls_g1_add benchmarking -void benchmark_bls_g1_add_impl(const std::string& test_name, bool mont) { +void benchmark_bls_g1_add() { // prepare g1 operand in Jacobian LE format g1 p = random_g1(); std::vector buf(96); - p.toAffineBytesLE(std::span((uint8_t*)buf.data(), 96), mont); - eosio::chain::span op1(buf.data(), buf.size()); + p.toAffineBytesLE(std::span((uint8_t*)buf.data(), 96), false); + eosio::chain::span op(buf.data(), buf.size()); // prepare result operand std::vector result_buf(96); @@ -161,34 +161,19 @@ void benchmark_bls_g1_add_impl(const std::string& test_name, bool mont) { // set up bls_g1_add to be benchmarked interface_in_benchmark interface; - std::function benchmarked_func {}; - if (mont) { - benchmarked_func = [&]() { - interface.interface->bls_g1_add_mont(op1, op1, result); - }; - } else { - benchmarked_func = [&]() { - interface.interface->bls_g1_add(op1, op1, result); - }; - } - - benchmarking(test_name, benchmarked_func); -} - -void benchmark_bls_g1_add() { - benchmark_bls_g1_add_impl("bls_g1_add", false); -} + auto benchmarked_func = [&]() { + interface.interface->bls_g1_add(op, op, result); + }; -void benchmark_bls_g1_add_mont() { - benchmark_bls_g1_add_impl("bls_g1_add_mont", true); + benchmarking("bls_g1_add", benchmarked_func); } // bls_g2_add benchmarking -void benchmark_bls_g2_add_impl(const std::string& test_name, bool mont) { +void benchmark_bls_g2_add() { // prepare g2 operand in Jacobian LE format g2 p = random_g2(); std::vector buf(192); - p.toAffineBytesLE(std::span((uint8_t*)buf.data(), 192), mont); + p.toAffineBytesLE(std::span((uint8_t*)buf.data(), 192), false); eosio::chain::span op(buf.data(), buf.size()); // prepare result operand @@ -197,39 +182,20 @@ void benchmark_bls_g2_add_impl(const std::string& test_name, bool mont) { // set up bls_g2_add to be benchmarked interface_in_benchmark interface; - std::function benchmarked_func {}; - if (mont) { - benchmarked_func = [&]() { - interface.interface->bls_g2_add_mont(op, op, result); - }; - } else { - benchmarked_func = [&]() { - interface.interface->bls_g2_add(op, op, result); - }; - } - -<<<<<<< HEAD - benchmarking(test_name, benchmarked_func); -} - -void benchmark_bls_g2_add() { - benchmark_bls_g2_add_impl("bls_g2_add", false); -} + auto benchmarked_func = [&]() { + interface.interface->bls_g2_add(op, op, result); + }; -void benchmark_bls_g2_add_mont() { - benchmark_bls_g2_add_impl("bls_g2_add_mont", true); -======= benchmarking("bls_g2_add", benchmarked_func); ->>>>>>> origin/yarkin/update_bls } // bls_g1_weighted_sum benchmarking utility -void benchmark_bls_g1_weighted_sum_impl(const std::string& test_name, uint32_t num_points, bool mont) { +void benchmark_bls_g1_weighted_sum_impl(const std::string& test_name, uint32_t num_points) { // prepare g1 points operand std::vector g1_buf(96*num_points); for (auto i=0u; i < num_points; ++i) { g1 p = random_g1(); - p.toAffineBytesLE(std::span((uint8_t*)g1_buf.data() + i * 96, 96), mont); + p.toAffineBytesLE(std::span((uint8_t*)g1_buf.data() + i * 96, 96), false); } chain::span g1_points(g1_buf.data(), g1_buf.size()); @@ -247,57 +213,35 @@ void benchmark_bls_g1_weighted_sum_impl(const std::string& test_name, uint32_t n // set up bls_g1_weighted_sum to be benchmarked interface_in_benchmark interface; - std::function benchmarked_func {}; - if (mont) { - benchmarked_func = [&]() { - interface.interface->bls_g1_weighted_sum_mont(g1_points, scalars, num_points, result); - }; - } else { - benchmarked_func = [&]() { - interface.interface->bls_g1_weighted_sum(g1_points, scalars, num_points, result); - }; - } + auto benchmarked_func = [&]() { + interface.interface->bls_g1_weighted_sum(g1_points, scalars, num_points, result); + }; benchmarking(test_name, benchmarked_func); } // bls_g1_weighted_sum benchmarking with 1 input point void benchmark_bls_g1_weighted_sum_one_point() { - benchmark_bls_g1_weighted_sum_impl("bls_g1_weighted_sum 1 point", 1, false); + benchmark_bls_g1_weighted_sum_impl("bls_g1_weighted_sum 1 point", 1); } // bls_g1_weighted_sum benchmarking with 3 input points void benchmark_bls_g1_weighted_sum_three_point() { - benchmark_bls_g1_weighted_sum_impl("bls_g1_weighted_sum 3 points", 3, false); + benchmark_bls_g1_weighted_sum_impl("bls_g1_weighted_sum 3 points", 3); } // bls_g1_weighted_sum benchmarking with 5 input points void benchmark_bls_g1_weighted_sum_five_point() { - benchmark_bls_g1_weighted_sum_impl("bls_g1_weighted_sum 5 points", 5, false); -} - -// bls_g1_weighted_sum benchmarking with 1 input point -void benchmark_bls_g1_weighted_sum_mont_one_point() { - benchmark_bls_g1_weighted_sum_impl("bls_g1_weighted_sum_mont 1 point", 1, true); -} - -// bls_g1_weighted_sum_mont benchmarking with 3 input points -void benchmark_bls_g1_weighted_sum_mont_three_point() { - benchmark_bls_g1_weighted_sum_impl("bls_g1_weighted_sum_mont 3 points", 3, true); -} - -// bls_g1_weighted_sum_mont benchmarking with 5 input points -void benchmark_bls_g1_weighted_sum_mont_five_point() { - benchmark_bls_g1_weighted_sum_impl("bls_g1_weighted_sum_mont 5 points", 5, true); + benchmark_bls_g1_weighted_sum_impl("bls_g1_weighted_sum 5 points", 5); } // bls_g2_weighted_sum benchmarking utility -void benchmark_bls_g2_weighted_sum_impl(const std::string& test_name, uint32_t num_points, bool mont) { +void benchmark_bls_g2_weighted_sum_impl(const std::string& test_name, uint32_t num_points) { // prepare g2 points operand std::vector g2_buf(192*num_points); for (auto i=0u; i < num_points; ++i) { g2 p = random_g2(); - p.toAffineBytesLE(std::span((uint8_t*)g2_buf.data() + i * 192, 192), mont); + p.toAffineBytesLE(std::span((uint8_t*)g2_buf.data() + i * 192, 192), false); } eosio::chain::span g2_points(g2_buf.data(), g2_buf.size()); @@ -315,58 +259,36 @@ void benchmark_bls_g2_weighted_sum_impl(const std::string& test_name, uint32_t n // set up bls_g2_weighted_sum to be benchmarked interface_in_benchmark interface; - std::function benchmarked_func {}; - if (mont) { - benchmarked_func = [&]() { - interface.interface->bls_g2_weighted_sum_mont(g2_points, scalars, num_points, result); - }; - } else { - benchmarked_func = [&]() { - interface.interface->bls_g2_weighted_sum(g2_points, scalars, num_points, result); - }; - } + auto benchmarked_func = [&]() { + interface.interface->bls_g2_weighted_sum(g2_points, scalars, num_points, result); + }; benchmarking(test_name, benchmarked_func); } // bls_g2_weighted_sum benchmarking with 1 input point void benchmark_bls_g2_weighted_sum_one_point() { - benchmark_bls_g2_weighted_sum_impl("bls_g2_weighted_sum 1 point", 1, false); + benchmark_bls_g2_weighted_sum_impl("bls_g2_weighted_sum 1 point", 1); } // bls_g2_weighted_sum benchmarking with 3 input points void benchmark_bls_g2_weighted_sum_three_point() { - benchmark_bls_g2_weighted_sum_impl("bls_g2_weighted_sum 3 points", 3, false); + benchmark_bls_g2_weighted_sum_impl("bls_g2_weighted_sum 3 points", 3); } // bls_g2_weighted_sum benchmarking with 5 input points void benchmark_bls_g2_weighted_sum_five_point() { - benchmark_bls_g2_weighted_sum_impl("bls_g2_weighted_sum 5 points", 5, false); -} - -// bls_g2_weighted_sum_mont benchmarking with 1 input point -void benchmark_bls_g2_weighted_sum_mont_one_point() { - benchmark_bls_g2_weighted_sum_impl("bls_g2_weighted_sum_mont 1 point", 1, true); -} - -// bls_g2_weighted_sum_mont benchmarking with 3 input points -void benchmark_bls_g2_weighted_sum_mont_three_point() { - benchmark_bls_g2_weighted_sum_impl("bls_g2_weighted_sum_mont 3 points", 3, true); -} - -// bls_g2_weighted_sum_mont benchmarking with 5 input points -void benchmark_bls_g2_weighted_sum_mont_five_point() { - benchmark_bls_g2_weighted_sum_impl("bls_g2_weighted_sum_mont 5 points", 5, true); + benchmark_bls_g2_weighted_sum_impl("bls_g2_weighted_sum 5 points", 5); } // bls_pairing benchmarking utility -void benchmark_bls_pairing_impl(const std::string& test_name, uint32_t num_pairs, bool mont) { +void benchmark_bls_pairing_impl(const std::string& test_name, uint32_t num_pairs) { // prepare g1 operand std::vector g1_buf(96*num_pairs); //g1_buf.reserve(96*num_pairs); for (auto i=0u; i < num_pairs; ++i) { g1 p = random_g1(); - p.toAffineBytesLE(std::span((uint8_t*)g1_buf.data() + i * 96, 96), mont); + p.toAffineBytesLE(std::span((uint8_t*)g1_buf.data() + i * 96, 96), false); } eosio::chain::span g1_points(g1_buf.data(), g1_buf.size()); @@ -374,7 +296,7 @@ void benchmark_bls_pairing_impl(const std::string& test_name, uint32_t num_pairs std::vector g2_buf(192*num_pairs); for (auto i=0u; i < num_pairs; ++i) { g2 p2 = random_g2(); - p2.toAffineBytesLE(std::span((uint8_t*)g2_buf.data() + i * 192, (192)), mont); + p2.toAffineBytesLE(std::span((uint8_t*)g2_buf.data() + i * 192, (192)), false); } eosio::chain::span g2_points(g2_buf.data(), g2_buf.size()); @@ -384,46 +306,29 @@ void benchmark_bls_pairing_impl(const std::string& test_name, uint32_t num_pairs // set up bls_pairing to be benchmarked interface_in_benchmark interface; - std::function benchmarked_func {}; - if (mont) { - benchmarked_func = [&]() { - interface.interface->bls_pairing_mont(g1_points, g2_points, num_pairs, result); - }; - } else { - benchmarked_func = [&]() { - interface.interface->bls_pairing(g1_points, g2_points, num_pairs, result); - }; - } + auto benchmarked_func = [&]() { + interface.interface->bls_pairing(g1_points, g2_points, num_pairs, result); + }; benchmarking(test_name, benchmarked_func); } // bls_pairing benchmarking with 1 input pair void benchmark_bls_pairing_one_pair() { - benchmark_bls_pairing_impl("bls_pairing 1 pair", 1, false); + benchmark_bls_pairing_impl("bls_pairing 1 pair", 1); } // bls_pairing benchmarking with 3 input pairs void benchmark_bls_pairing_three_pair() { - benchmark_bls_pairing_impl("bls_pairing 3 pairs", 3, false); -} - -// bls_pairing_mont benchmarking with 1 input pair -void benchmark_bls_pairing_mont_one_pair() { - benchmark_bls_pairing_impl("bls_pairing_mont 1 pair", 1, true); -} - -// bls_pairing_mont benchmarking with 3 input pairs -void benchmark_bls_pairing_mont_three_pair() { - benchmark_bls_pairing_impl("bls_pairing_mont 3 pairs", 3, true); + benchmark_bls_pairing_impl("bls_pairing 3 pairs", 3); } // bls_g1_map benchmarking -void benchmark_bls_g1_map_impl(const std::string& test_name, bool mont) { +void benchmark_bls_g1_map() { // prepare e operand. Must be fp LE. std::vector e_buf(48); fp a = random_fe(); - a.toBytesLE(std::span((uint8_t*)e_buf.data(), 48), mont); + a.toBytesLE(std::span((uint8_t*)e_buf.data(), 48), false); eosio::chain::span e(e_buf.data(), e_buf.size()); // prepare result operand @@ -432,34 +337,19 @@ void benchmark_bls_g1_map_impl(const std::string& test_name, bool mont) { // set up bls_g1_map to be benchmarked interface_in_benchmark interface; - std::function benchmarked_func {}; - if (mont) { - benchmarked_func = [&]() { - interface.interface->bls_g1_map_mont(e, result); - }; - } else { - benchmarked_func = [&]() { - interface.interface->bls_g1_map(e, result); - }; - } - - benchmarking(test_name, benchmarked_func); -} - -void benchmark_bls_g1_map() { - benchmark_bls_g1_map_impl("bls_g1_map", false); -} + auto benchmarked_func = [&]() { + interface.interface->bls_g1_map(e, result); + }; -void benchmark_bls_g1_map_mont() { - benchmark_bls_g1_map_impl("bls_g1_map_mont", true); + benchmarking("bls_g1_map", benchmarked_func); } // bls_g2_map benchmarking -void benchmark_bls_g2_map_impl(const std::string& test_name, bool mont) { +void benchmark_bls_g2_map() { // prepare e operand. Must be fp2 LE. std::vector e_buf(96); fp2 a = random_fe2(); - a.toBytesLE(std::span((uint8_t*)e_buf.data(), 96), mont); + a.toBytesLE(std::span((uint8_t*)e_buf.data(), 96), false); eosio::chain::span e(e_buf.data(), e_buf.size()); // prepare result operand @@ -468,30 +358,15 @@ void benchmark_bls_g2_map_impl(const std::string& test_name, bool mont) { // set up bls_g2_map to be benchmarked interface_in_benchmark interface; - std::function benchmarked_func {}; - if (mont) { - benchmarked_func = [&]() { - interface.interface->bls_g2_map_mont(e, result); - }; - } else { - benchmarked_func = [&]() { - interface.interface->bls_g2_map(e, result); - }; - } - - benchmarking(test_name, benchmarked_func); -} - -void benchmark_bls_g2_map() { - benchmark_bls_g2_map_impl("bls_g2_map", false); -} + auto benchmarked_func = [&]() { + interface.interface->bls_g2_map(e, result); + }; -void benchmark_bls_g2_map_mont() { - benchmark_bls_g2_map_impl("bls_g2_map_mont", true); + benchmarking("bls_g2_map", benchmarked_func); } // bls_fp_mod benchmarking -void benchmark_bls_fp_mod_impl(const std::string& test_name, bool mont) { +void benchmark_bls_fp_mod() { // prepare scalar operand std::vector scalar_buf(64); // random_scalar returns 32 bytes. need to call it twice @@ -507,74 +382,44 @@ void benchmark_bls_fp_mod_impl(const std::string& test_name, bool mont) { // set up bls_fp_mod to be benchmarked interface_in_benchmark interface; - std::function benchmarked_func {}; - if (mont) { - benchmarked_func = [&]() { - interface.interface->bls_fp_mod_mont(scalar, result); - }; - } else { - benchmarked_func = [&]() { - interface.interface->bls_fp_mod(scalar, result); - }; - } - - benchmarking(test_name, benchmarked_func); -} - -void benchmark_bls_fp_mod() { - benchmark_bls_fp_mod_impl("bls_fp_mod", false); -} + auto benchmarked_func = [&]() { + interface.interface->bls_fp_mod(scalar, result); + }; -void benchmark_bls_fp_mod_mont() { - benchmark_bls_fp_mod_impl("bls_fp_mod_mont", true); + benchmarking("bls_fp_mod", benchmarked_func); } -void benchmark_bls_fp_mul_impl(const std::string& test_name, bool mont) { +void benchmark_bls_fp_mul() { // prepare op1 std::vector op1_buf(48); fp a = random_fe(); - a.toBytesLE(std::span((uint8_t*)op1_buf.data(), 48), mont); + a.toBytesLE(std::span((uint8_t*)op1_buf.data(), 48), false); eosio::chain::span op1(op1_buf.data(), op1_buf.size()); // prepare op2 std::vector op2_buf(48); fp b = random_fe(); - b.toBytesLE(std::span((uint8_t*)op2_buf.data(), 48), mont); + b.toBytesLE(std::span((uint8_t*)op2_buf.data(), 48), false); eosio::chain::span op2(op1_buf.data(), op2_buf.size()); // prepare result operand std::vector result_buf(48); eosio::chain::span result(result_buf.data(), result_buf.size()); - // set up bls_pairing to be benchmarked + // set up bls_fp_mul to be benchmarked interface_in_benchmark interface; - std::function benchmarked_func {}; - if (mont) { - benchmarked_func = [&]() { - interface.interface->bls_fp_mul_mont(op1, op2, result); - }; - } else { - benchmarked_func = [&]() { - interface.interface->bls_fp_mul(op1, op2, result); - }; - } - - benchmarking(test_name, benchmarked_func); -} - -void benchmark_bls_fp_mul() { - benchmark_bls_fp_mul_impl("bls_fp_mul", false); -} + auto benchmarked_func = [&]() { + interface.interface->bls_fp_mul(op1, op2, result); + }; -void benchmark_bls_fp_mul_mont() { - benchmark_bls_fp_mul_impl("bls_fp_mul_mont", true); + benchmarking("bls_fp_mul", benchmarked_func); } -void benchmark_bls_fp_exp_impl(const std::string& test_name, bool mont) { +void benchmark_bls_fp_exp() { // prepare base std::vector base_buf(48); fp a = random_fe(); - a.toBytesLE(std::span((uint8_t*)base_buf.data(), 48), mont); + a.toBytesLE(std::span((uint8_t*)base_buf.data(), 48), false); eosio::chain::span base(base_buf.data(), base_buf.size()); // prepare exp operand @@ -592,59 +437,29 @@ void benchmark_bls_fp_exp_impl(const std::string& test_name, bool mont) { // set up bls_fp_exp to be benchmarked interface_in_benchmark interface; - std::function benchmarked_func {}; - if (mont) { - benchmarked_func = [&]() { - interface.interface->bls_fp_exp_mont(base, exp, result); - }; - } else { - benchmarked_func = [&]() { - interface.interface->bls_fp_exp(base, exp, result); - }; - } - - benchmarking(test_name, benchmarked_func); -} - -void benchmark_bls_fp_exp() { - benchmark_bls_fp_exp_impl("bls_fp_exp", false); -} + auto benchmarked_func = [&]() { + interface.interface->bls_fp_exp(base, exp, result); + }; -void benchmark_bls_fp_exp_mont() { - benchmark_bls_fp_exp_impl("bls_fp_exp_mont", true); + benchmarking("bls_fp_exp", benchmarked_func); } // register benchmarking functions void bls_benchmarking() { benchmark_bls_g1_add(); - benchmark_bls_g1_add_mont(); benchmark_bls_g2_add(); - benchmark_bls_g2_add_mont(); benchmark_bls_pairing_one_pair(); - benchmark_bls_pairing_mont_one_pair(); benchmark_bls_pairing_three_pair(); - benchmark_bls_pairing_mont_three_pair(); benchmark_bls_g1_weighted_sum_one_point(); - benchmark_bls_g1_weighted_sum_mont_one_point(); benchmark_bls_g1_weighted_sum_three_point(); - benchmark_bls_g1_weighted_sum_mont_three_point(); benchmark_bls_g1_weighted_sum_five_point(); - benchmark_bls_g1_weighted_sum_mont_five_point(); benchmark_bls_g2_weighted_sum_one_point(); - benchmark_bls_g2_weighted_sum_mont_one_point(); benchmark_bls_g2_weighted_sum_three_point(); - benchmark_bls_g2_weighted_sum_mont_three_point(); benchmark_bls_g2_weighted_sum_five_point(); - benchmark_bls_g2_weighted_sum_mont_five_point(); benchmark_bls_g1_map(); - benchmark_bls_g1_map_mont(); benchmark_bls_g2_map(); - benchmark_bls_g2_map_mont(); benchmark_bls_fp_mod(); - benchmark_bls_fp_mod_mont(); benchmark_bls_fp_mul(); - benchmark_bls_fp_mul_mont(); benchmark_bls_fp_exp(); - benchmark_bls_fp_exp_mont(); } } // namespace benchmark From 6a9a8b1d24f2fa50e7b76f4eecce9e3088c59bfc Mon Sep 17 00:00:00 2001 From: Lin Huang Date: Thu, 16 Nov 2023 10:38:13 -0500 Subject: [PATCH 19/24] use std::array instead of std::vector to simply conversion to eosio::chain::span --- benchmark/bls.cpp | 77 +++++++++++++++++------------------------------ 1 file changed, 28 insertions(+), 49 deletions(-) diff --git a/benchmark/bls.cpp b/benchmark/bls.cpp index 2b83069145..4c86e78ba1 100644 --- a/benchmark/bls.cpp +++ b/benchmark/bls.cpp @@ -151,13 +151,11 @@ bls12_381::g2 random_g2() void benchmark_bls_g1_add() { // prepare g1 operand in Jacobian LE format g1 p = random_g1(); - std::vector buf(96); - p.toAffineBytesLE(std::span((uint8_t*)buf.data(), 96), false); - eosio::chain::span op(buf.data(), buf.size()); + std::array op; + p.toAffineBytesLE(std::span((uint8_t*)op.data(), 96), false); // prepare result operand - std::vector result_buf(96); - eosio::chain::span result(result_buf.data(), result_buf.size()); + std::array result; // set up bls_g1_add to be benchmarked interface_in_benchmark interface; @@ -172,13 +170,11 @@ void benchmark_bls_g1_add() { void benchmark_bls_g2_add() { // prepare g2 operand in Jacobian LE format g2 p = random_g2(); - std::vector buf(192); - p.toAffineBytesLE(std::span((uint8_t*)buf.data(), 192), false); - eosio::chain::span op(buf.data(), buf.size()); + std::array op; + p.toAffineBytesLE(std::span((uint8_t*)op.data(), 192), false); // prepare result operand - std::vector result_buf(192); - eosio::chain::span result(result_buf.data(), result_buf.size()); + std::array result; // set up bls_g2_add to be benchmarked interface_in_benchmark interface; @@ -208,8 +204,7 @@ void benchmark_bls_g1_weighted_sum_impl(const std::string& test_name, uint32_t n chain::span scalars(scalars_buf.data(), scalars_buf.size()); // prepare result operand - std::vector result_buf(96); - eosio::chain::span result(result_buf.data(), result_buf.size()); + std::array result; // set up bls_g1_weighted_sum to be benchmarked interface_in_benchmark interface; @@ -254,8 +249,7 @@ void benchmark_bls_g2_weighted_sum_impl(const std::string& test_name, uint32_t n eosio::chain::span scalars(scalars_buf.data(), scalars_buf.size()); // prepare result operand - std::vector result_buf(192); - eosio::chain::span result(result_buf.data(), result_buf.size()); + std::array result; // set up bls_g2_weighted_sum to be benchmarked interface_in_benchmark interface; @@ -285,7 +279,6 @@ void benchmark_bls_g2_weighted_sum_five_point() { void benchmark_bls_pairing_impl(const std::string& test_name, uint32_t num_pairs) { // prepare g1 operand std::vector g1_buf(96*num_pairs); - //g1_buf.reserve(96*num_pairs); for (auto i=0u; i < num_pairs; ++i) { g1 p = random_g1(); p.toAffineBytesLE(std::span((uint8_t*)g1_buf.data() + i * 96, 96), false); @@ -301,8 +294,7 @@ void benchmark_bls_pairing_impl(const std::string& test_name, uint32_t num_pairs eosio::chain::span g2_points(g2_buf.data(), g2_buf.size()); // prepare result operand - std::vector result_buf(576); - eosio::chain::span result(result_buf.data(), result_buf.size()); + std::array result; // set up bls_pairing to be benchmarked interface_in_benchmark interface; @@ -326,14 +318,12 @@ void benchmark_bls_pairing_three_pair() { // bls_g1_map benchmarking void benchmark_bls_g1_map() { // prepare e operand. Must be fp LE. - std::vector e_buf(48); + std::array e; fp a = random_fe(); - a.toBytesLE(std::span((uint8_t*)e_buf.data(), 48), false); - eosio::chain::span e(e_buf.data(), e_buf.size()); + a.toBytesLE(std::span((uint8_t*)e.data(), 48), false); // prepare result operand - std::vector result_buf(96); - eosio::chain::span result(result_buf.data(), result_buf.size()); + std::array result; // set up bls_g1_map to be benchmarked interface_in_benchmark interface; @@ -346,15 +336,12 @@ void benchmark_bls_g1_map() { // bls_g2_map benchmarking void benchmark_bls_g2_map() { - // prepare e operand. Must be fp2 LE. - std::vector e_buf(96); + std::array e; fp2 a = random_fe2(); - a.toBytesLE(std::span((uint8_t*)e_buf.data(), 96), false); - eosio::chain::span e(e_buf.data(), e_buf.size()); + a.toBytesLE(std::span((uint8_t*)e.data(), 96), false); // prepare result operand - std::vector result_buf(192); - eosio::chain::span result(result_buf.data(), result_buf.size()); + std::array result; // set up bls_g2_map to be benchmarked interface_in_benchmark interface; @@ -368,17 +355,15 @@ void benchmark_bls_g2_map() { // bls_fp_mod benchmarking void benchmark_bls_fp_mod() { // prepare scalar operand - std::vector scalar_buf(64); + std::array scalar; // random_scalar returns 32 bytes. need to call it twice for (auto i=0u; i < 2; ++i) { std::array s = random_scalar(); - scalar::toBytesLE(s, std::span((uint8_t*)scalar_buf.data() + i*32, 32)); + scalar::toBytesLE(s, std::span((uint8_t*)scalar.data() + i*32, 32)); } - chain::span scalar(scalar_buf.data(), scalar_buf.size()); // prepare result operand - std::vector result_buf(48); - eosio::chain::span result(result_buf.data(), result_buf.size()); + std::array result; // set up bls_fp_mod to be benchmarked interface_in_benchmark interface; @@ -391,20 +376,17 @@ void benchmark_bls_fp_mod() { void benchmark_bls_fp_mul() { // prepare op1 - std::vector op1_buf(48); + std::array op1; fp a = random_fe(); - a.toBytesLE(std::span((uint8_t*)op1_buf.data(), 48), false); - eosio::chain::span op1(op1_buf.data(), op1_buf.size()); + a.toBytesLE(std::span((uint8_t*)op1.data(), 48), false); // prepare op2 - std::vector op2_buf(48); + std::array op2; fp b = random_fe(); - b.toBytesLE(std::span((uint8_t*)op2_buf.data(), 48), false); - eosio::chain::span op2(op1_buf.data(), op2_buf.size()); + b.toBytesLE(std::span((uint8_t*)op2.data(), 48), false); // prepare result operand - std::vector result_buf(48); - eosio::chain::span result(result_buf.data(), result_buf.size()); + std::array result; // set up bls_fp_mul to be benchmarked interface_in_benchmark interface; @@ -417,23 +399,20 @@ void benchmark_bls_fp_mul() { void benchmark_bls_fp_exp() { // prepare base - std::vector base_buf(48); + std::array base; fp a = random_fe(); - a.toBytesLE(std::span((uint8_t*)base_buf.data(), 48), false); - eosio::chain::span base(base_buf.data(), base_buf.size()); + a.toBytesLE(std::span((uint8_t*)base.data(), 48), false); // prepare exp operand - std::vector exp_buf(64); + std::array exp; // random_scalar returns 32 bytes. need to call it twice for (auto i=0u; i < 2; ++i) { std::array s = random_scalar(); - scalar::toBytesLE(s, std::span((uint8_t*)exp_buf.data() + i*32, 32)); + scalar::toBytesLE(s, std::span((uint8_t*)exp.data() + i*32, 32)); } - eosio::chain::span exp(exp_buf.data(), exp_buf.size()); // prepare result operand - std::vector result_buf(48); - eosio::chain::span result(result_buf.data(), result_buf.size()); + std::array result; // set up bls_fp_exp to be benchmarked interface_in_benchmark interface; From cb4ceaa530bf11e014390d7e9deea9f269ee81ff Mon Sep 17 00:00:00 2001 From: yarkin Date: Tue, 21 Nov 2023 21:15:30 +0800 Subject: [PATCH 20/24] Update feature signature. --- libraries/chain/protocol_feature_manager.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libraries/chain/protocol_feature_manager.cpp b/libraries/chain/protocol_feature_manager.cpp index 7a82555f4e..14455272ad 100644 --- a/libraries/chain/protocol_feature_manager.cpp +++ b/libraries/chain/protocol_feature_manager.cpp @@ -263,12 +263,13 @@ Enables new `get_block_num` intrinsic which returns the current block number. } ) ( builtin_protocol_feature_t::bls_primitives, builtin_protocol_feature_spec{ "BLS_PRIMITIVES", - fc::variant("01969c44de35999b924095ae7f50081a7f274409fdbccb9fc54fa7836c76089c").as(), + fc::variant("dbb957731e310f86462d1643fd98f69eedb193892e3c1d38593410e34ad5d8ef").as(), // SHA256 hash of the raw message below within the comment delimiters (do not modify message below). /* Builtin protocol feature: BLS_PRIMITIVES + Adds new cryptographic host functions -- Add, multiply, multi-exponentiation and pairing functions for the bls12-381 elliptic curve. +- Add, weighted-sum, map, and pairing functions for the bls12-381 elliptic curve. */ {} } ) From 12699519799028f28bbffe7cbdf73fddf96c55a4 Mon Sep 17 00:00:00 2001 From: yarkin Date: Thu, 30 Nov 2023 01:51:46 +0800 Subject: [PATCH 21/24] Update feature manager, fix deep-mind.log accordinglly. --- libraries/chain/protocol_feature_manager.cpp | 8 +- unittests/deep-mind/deep-mind.log | 88 ++++++++++---------- 2 files changed, 48 insertions(+), 48 deletions(-) diff --git a/libraries/chain/protocol_feature_manager.cpp b/libraries/chain/protocol_feature_manager.cpp index 14455272ad..5a270c6bbd 100644 --- a/libraries/chain/protocol_feature_manager.cpp +++ b/libraries/chain/protocol_feature_manager.cpp @@ -262,14 +262,14 @@ Enables new `get_block_num` intrinsic which returns the current block number. {} } ) ( builtin_protocol_feature_t::bls_primitives, builtin_protocol_feature_spec{ - "BLS_PRIMITIVES", - fc::variant("dbb957731e310f86462d1643fd98f69eedb193892e3c1d38593410e34ad5d8ef").as(), + "BLS_PRIMITIVES2", + fc::variant("c0cce5bcd8ea19a28d9e12eafda65ebe6d0e0177e280d4f20c7ad66dcd9e011b").as(), // SHA256 hash of the raw message below within the comment delimiters (do not modify message below). /* -Builtin protocol feature: BLS_PRIMITIVES +Builtin protocol feature: BLS_PRIMITIVES2 Adds new cryptographic host functions -- Add, weighted-sum, map, and pairing functions for the bls12-381 elliptic curve. +- Add, weighted sum, map, and pairing functions for the bls12-381 elliptic curve. */ {} } ) diff --git a/unittests/deep-mind/deep-mind.log b/unittests/deep-mind/deep-mind.log index 548585328c..83af237cad 100644 --- a/unittests/deep-mind/deep-mind.log +++ b/unittests/deep-mind/deep-mind.log @@ -34,11 +34,11 @@ DMLOG START_BLOCK 3 DMLOG CREATION_OP ROOT 0 DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":0,"consumed":0},"cpu_usage":{"last_ordinal":1262304002,"value_ex":1157,"consumed":101},"ram_usage":2724} DMLOG TRX_OP CREATE onblock da9fbe9042e1bc9bd64d7a4506534d492107a29f79ad671c1fea19ae3fb70eb4 01e10b5e02005132b41600000000010000000000ea305500000000221acfa4010000000000ea305500000000a8ed32329801013b3d4b0000000000ea30550000000000015ab65a885a31e441ac485ebd2aeba87bf7ee6e7bcc40bf3a24506ba1000000000000000000000000000000000000000000000000000000000000000062267e8b11d7d8f28e1f991a4de2b08cf92500861af2795765bdc9263cd6f4cd000000000001000021010ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd000000 -DMLOG APPLIED_TRANSACTION 3 da9fbe9042e1bc9bd64d7a4506534d492107a29f79ad671c1fea19ae3fb70eb403000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d9101006400000000000000000000000000000000000000000001010000010000000000ea3055ccfe3b56076237b0b6da2f580652ee1420231b96d3d96b28183769ac932c9e5902000000000000000200000000000000010000000000ea3055020000000000000000000000000000ea30550000000000ea305500000000221acfa4010000000000ea305500000000a8ed32329801013b3d4b0000000000ea30550000000000015ab65a885a31e441ac485ebd2aeba87bf7ee6e7bcc40bf3a24506ba1000000000000000000000000000000000000000000000000000000000000000062267e8b11d7d8f28e1f991a4de2b08cf92500861af2795765bdc9263cd6f4cd000000000001000021010ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd00000000000000000000da9fbe9042e1bc9bd64d7a4506534d492107a29f79ad671c1fea19ae3fb70eb403000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910000000000000000 +DMLOG APPLIED_TRANSACTION 3 da9fbe9042e1bc9bd64d7a4506534d492107a29f79ad671c1fea19ae3fb70eb403000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b4401006400000000000000000000000000000000000000000001010000010000000000ea3055ccfe3b56076237b0b6da2f580652ee1420231b96d3d96b28183769ac932c9e5902000000000000000200000000000000010000000000ea3055020000000000000000000000000000ea30550000000000ea305500000000221acfa4010000000000ea305500000000a8ed32329801013b3d4b0000000000ea30550000000000015ab65a885a31e441ac485ebd2aeba87bf7ee6e7bcc40bf3a24506ba1000000000000000000000000000000000000000000000000000000000000000062267e8b11d7d8f28e1f991a4de2b08cf92500861af2795765bdc9263cd6f4cd000000000001000021010ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd00000000000000000000da9fbe9042e1bc9bd64d7a4506534d492107a29f79ad671c1fea19ae3fb70eb403000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG RAM_OP 0 eosio code add setcode eosio 180494 177770 DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":35325,"consumed":6104},"cpu_usage":{"last_ordinal":1262304002,"value_ex":12732,"consumed":2101},"ram_usage":180494} -DMLOG APPLIED_TRANSACTION 3 03917c562680b415b93db73416ff29230dfbe7ab1ba4d208b46029d01333cd3a03000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910100d0070000fb050000000000000000d8170000000000000001010000010000000000ea30559a90c525172f87bbac0a6378610727f0fe1d7ebe908df973923d29a1606f9a5703000000000000000300000000000000010000000000ea3055030000000000000001000000000000ea30550000000000ea305500000040258ab2c2010000000000ea305500000000a8ed3232fe8a010000000000ea30550000f18a010061736d01000000019d011a60000060037f7e7f0060027f7e0060027f7f0060057f7e7e7e7e0060047f7e7e7e0060017f017f60017f0060037f7f7f017f6000017f60027f7f017f60017e0060027e7f0060047e7e7e7e0060027f7f017e6000017e60047e7e7e7e017f60047f7e7e7f0060037f7f7f0060067e7e7e7e7f7f017f60047f7e7f7f0060037e7e7e0060037e7e7f017f60047f7f7e7f0060027e7e0060047f7f7f7f00028e041803656e761469735f666561747572655f616374697661746564000603656e761370726561637469766174655f66656174757265000703656e760c656f73696f5f617373657274000303656e76066d656d736574000803656e7610616374696f6e5f646174615f73697a65000903656e7610726561645f616374696f6e5f64617461000a03656e76066d656d637079000803656e760c726571756972655f61757468000b03656e760e7365745f70726976696c65676564000c03656e76137365745f7265736f757263655f6c696d697473000d03656e760561626f7274000003656e76167365745f70726f706f7365645f70726f647563657273000e03656e76207365745f626c6f636b636861696e5f706172616d65746572735f7061636b6564000303656e76206765745f626c6f636b636861696e5f706172616d65746572735f7061636b6564000a03656e760c63757272656e745f74696d65000f03656e76146765745f6163746976655f70726f647563657273000a03656e760b64625f66696e645f693634001003656e76095f5f6173686c746933001103656e7611656f73696f5f6173736572745f636f6465000203656e761063757272656e745f7265636569766572000f03656e760a64625f6765745f693634000803656e7606736861323536001203656e760c64625f73746f72655f693634001303656e760d64625f7570646174655f69363400140347460006070007090a08060607070a0a030307070a060715011602160316041603160316030516011603030a0a0a030a17170318181818181818180318181818031818181818081904050170010a0a05030100010616037f014180c0000b7f0041abc3000b7f0041abc3000b070901056170706c79002d090f010041010b092e30323436383a3b3d0ac98001460400101b0b800101037f02400240024002402000450d004100410028028c40200041107622016a220236028c404100410028028440220320006a41076a417871220036028440200241107420004d0d0120014000417f460d020c030b41000f0b4100200241016a36028c40200141016a4000417f470d010b4100419cc000100220030f0b20030b02000b3601017f230041106b2200410036020c4100200028020c28020041076a417871220036028440410020003602804041003f0036028c400b02000b06004190c0000bf50101067f4100210202400240410020006b22032000712000470d00200041104b0d01200110190f0b101d411636020041000f0b0240024002402000417f6a220420016a10192200450d002000200420006a2003712202460d012000417c6a220328020022044107712201450d02200020044178716a220441786a2205280200210620032001200220006b2207723602002002417c6a200420026b2203200172360200200241786a20064107712201200772360200200520012003723602002000101a0b20020f0b20000f0b200241786a200041786a280200200220006b22006a3602002002417c6a200328020020006b36020020020b3301017f411621030240024020014104490d0020012002101e2201450d0120002001360200410021030b20030f0b101d2802000b3801027f02402000410120001b2201101922000d000340410021004100280298402202450d012002110000200110192200450d000b0b20000b0600200010200b0e0002402000450d002000101a0b0b0600200010220b6b01027f230041106b2202240002402002410c6a20014104200141044b1b22012000410120001b2203101f450d00024003404100280298402200450d0120001100002002410c6a20012003101f0d000c020b0b2002410036020c0b200228020c2100200241106a240020000b08002000200110240b0e0002402000450d002000101a0b0b08002000200110260b0500100a000b4e01017f230041e0006b220124002001200141d8006a3602082001200141106a3602042001200141106a36020020012000102a1a200141106a200128020420012802006b100c200141e0006a24000b920901047f02402000280208200028020422026b41074a0d00410041e8c0001002200041046a28020021020b20022001410810061a200041046a2202200228020041086a2203360200200141086a21040240200041086a220528020020036b41034a0d00410041e8c0001002200228020021030b20032004410410061a2002200228020041046a22033602002001410c6a21020240200528020020036b41034a0d00410041e8c0001002200041046a28020021030b20032002410410061a200041046a2202200228020041046a2203360200200141106a21040240200041086a220528020020036b41034a0d00410041e8c0001002200228020021030b20032004410410061a2002200228020041046a2203360200200141146a21020240200528020020036b41034a0d00410041e8c0001002200041046a28020021030b20032002410410061a200041046a2202200228020041046a2203360200200141186a21040240200041086a220528020020036b41034a0d00410041e8c0001002200228020021030b20032004410410061a2002200228020041046a22033602002001411c6a21020240200528020020036b41034a0d00410041e8c0001002200041046a28020021030b20032002410410061a200041046a2202200228020041046a2203360200200141206a21040240200041086a220528020020036b41034a0d00410041e8c0001002200228020021030b20032004410410061a2002200228020041046a2203360200200141246a21020240200528020020036b41034a0d00410041e8c0001002200041046a28020021030b20032002410410061a200041046a2202200228020041046a2203360200200141286a21040240200041086a220528020020036b41034a0d00410041e8c0001002200228020021030b20032004410410061a2002200228020041046a22033602002001412c6a21020240200528020020036b41034a0d00410041e8c0001002200041046a28020021030b20032002410410061a200041046a2202200228020041046a2203360200200141306a21040240200041086a220528020020036b41034a0d00410041e8c0001002200228020021030b20032004410410061a2002200228020041046a2203360200200141346a21020240200528020020036b41034a0d00410041e8c0001002200041046a28020021030b20032002410410061a200041046a2202200228020041046a2203360200200141386a21040240200041086a220528020020036b41034a0d00410041e8c0001002200228020021030b20032004410410061a2002200228020041046a22033602002001413c6a21020240200528020020036b41034a0d00410041e8c0001002200041046a28020021030b20032002410410061a200041046a2202200228020041046a2203360200200141c0006a21040240200041086a220528020020036b41014a0d00410041e8c0001002200228020021030b20032004410210061a2002200228020041026a2203360200200141c2006a21010240200528020020036b41014a0d00410041e8c0001002200041046a28020021030b20032001410210061a200041046a2201200128020041026a36020020000bfa0203017f027e017f230041206b220124002001200029030022024220883c000b200120024228883c000a200120024230883c0009200120024238883c00082001200041086a29030022034220883c0003200120034228883c0002200120034230883c0001200120034238883c000020012002a722043a000f200120044108763a000e200120044110763a000d200120044118763a000c20012003a722043a0007200120044108763a0006200120044110763a0005200120044118763a00042001200041186a29030022023c00172001200029031022034220883c001b200120034228883c001a200120034230883c0019200120034238883c0018200120024220883c0013200120024228883c0012200120024230883c0011200120024238883c001020012002a722004108763a0016200120004110763a0015200120004118763a001420012003a722003a001f200120004108763a001e200120004110763a001d200120004118763a001c200110002100200141206a240020000bf60203017f027e017f230041206b220124002001200029030022024220883c000b200120024228883c000a200120024230883c0009200120024238883c00082001200041086a29030022034220883c0003200120034228883c0002200120034230883c0001200120034238883c000020012002a722043a000f200120044108763a000e200120044110763a000d200120044118763a000c20012003a722043a0007200120044108763a0006200120044110763a0005200120044118763a00042001200041186a29030022023c00172001200029031022034220883c001b200120034228883c001a200120034230883c0019200120034238883c0018200120024220883c0013200120024228883c0012200120024230883c0011200120024238883c001020012002a722004108763a0016200120004110763a0015200120004118763a001420012003a722003a001f200120004108763a001e200120004110763a001d200120004118763a001c20011001200141206a24000bcc0401017f23004190016b220324001018024020012000520d0002400240024002400240024002400240200242ffffb7f6a497b2d942570d00200242ffffffffb5f7d6d942570d01200242808080d0b2b3bb9932510d03200242808080c093fad6d942510d0420024280808080b6f7d6d942520d082003410036028c0120034101360288012003200329038801370300200120012003102f1a0c080b200242fffffffffff698d942550d0120024290a9d9d9dd8c99d6ba7f510d0420024280808080daac9bd6ba7f520d0720034100360264200341023602602003200329036037032820012001200341286a10311a0c070b2002428080b8f6a497b2d942510d0420024280808096cdebd4d942520d062003410036026c200341033602682003200329036837032020012001200341206a10331a0c060b2002428080808080f798d942510d042002428080b8f6a4979ad942520d0520034100360284012003410436028001200320032903800137030820012001200341086a10351a0c050b20034100360254200341053602502003200329035037033820012001200341386a10371a0c040b20034100360274200341063602702003200329037037031820012001200341186a10391a0c030b2003410036024c200341073602482003200329034837034020012001200341c0006a10371a0c020b2003410036027c200341083602782003200329037837031020012001200341106a103c1a0c010b2003410036025c200341093602582003200329035837033020012001200341306a103e1a0b4100101c20034190016a24000b1200200029030010072001200241004710080bd30201077f230041306b2203210420032400200228020421052002280200210641002102024010042207450d00024002402007418104490d002007101921020c010b20032007410f6a4170716b220224000b2002200710051a0b200441003a002820044200370320200220076a2103200441206a41086a210802400240200741074b0d0041004185c1001002200441206a2002410810061a200241086a21090c010b200441206a2002410810061a200241086a210920074108470d0041004185c10010020b20082009410110061a200441186a200336020020042002360210200441146a200241096a3602002004200137030820042000370300200420054101756a2103200441286a2d000021082004290320210002402005410171450d00200328020020066a28020021060b20032000200841ff0171200611010002402007418104490d002002101a0b200441306a240041010b0600200110070b830201057f230041306b22032104200324002002280204210520022802002106024002400240024010042207450d002007418104490d012007101921020c020b410021020c020b20032007410f6a4170716b220224000b2002200710051a0b20044200370328200220076a21030240200741074b0d0041004185c10010020b200441286a2002410810061a2004411c6a200241086a360200200441206a2003360200200420013703102004200037030820042002360218200441086a20054101756a21032004290328210002402005410171450d00200328020020066a28020021060b20032000200611020002402007418104490d002002101a0b200441306a240041010b0d0020002903001007200110290bf70201067f230041a0026b2203210420032400200228020421052002280200210641002102024010042207450d00024002402007418104490d002007101921020c010b20032007410f6a4170716b220224000b2002200710051a0b200441c8006a410041c80010031a2004200236023c200420023602382004200220076a360240200441386a200441c8006a10421a200441086a41086a220320042802403602002004200429033837030820044190016a41086a220820032802003602002004200429030837039001200441d8016a41086a20082802002203360200200441306a2003360200200420003703182004200137032020042004290390012200370328200420003703d80120044190016a200441c8006a41c80010061a200441d8016a20044190016a41c80010061a200441186a20054101756a210302402005410171450d00200328020020066a28020021060b2003200441d8016a200611030002402007418104490d002002101a0b200441a0026a240041010b130020002903001007200120022003200410090b940302067f027e23004180016b22032104200324002002280204210520022802002106024002400240024010042207450d002007418104490d012007101921020c020b410021020c020b20032007410f6a4170716b220224000b2002200710051a0b2004420037034820044200370340200442003703502004420037035820042002360234200420023602302004200220076a3602382004200441306a3602702004200441c0006a360210200441106a200441f0006a103f200441086a2203200428023836020020042004290330370300200441e0006a41086a2208200328020036020020042004290300370360200441f0006a41086a20082802002203360200200441286a2003360200200420003703102004200137031820042004290360220037032020042000370370200441106a20054101756a21032004290358210020042903502101200429034821092004290340210a02402005410171450d00200328020020066a28020021060b2003200a200920012000200611040002402007418104490d002002101a0b20044180016a240041010b0d00200029030010072001102c0bfe0301087f230041a0016b22032104200324002002280204210520022802002106024002400240024010042207450d002007418104490d012007101921020c020b410021020c020b20032007410f6a4170716b220224000b2002200710051a0b200441c0006a41186a22034200370300200441c0006a41106a22084200370300200442003703482004420037034020042002360234200420023602302004200220076a3602382004200441306a3602602004200441c0006a3602800120044180016a200441e0006a1048200441086a2209200428023836020020042004290330370300200441e0006a41086a220a20092802003602002004200429030037036020044180016a41086a200a2802002209360200200441106a41186a200936020020042000370310200420013703182004200429036022003703202004200037038001200441e0006a41186a22092003290300370300200441e0006a41106a22032008290300370300200420042903483703682004200429034037036020044180016a41186a200929030037030020044180016a41106a200329030037030020042004290368370388012004200429036037038001200441106a20054101756a210302402005410171450d00200328020020066a28020021060b200320044180016a200611030002402007418104490d002002101a0b200441a0016a240041010b5601027f23002202210320002903001007024010042200418104490d00200010192202200010051a20022000100b1a200324000f0b20022000410f6a4170716b220224002002200010051a20022000100b1a200324000bb80501077f230041f0006b220321042003240020022802042105200228020021064100210741002102024010042208450d00024002402008418104490d002008101921020c010b20032008410f6a4170716b220224000b2002200810051a0b200441003602482004420037034020042002360234200420023602302004200220086a360238200441306a200441c0006a10411a200441086a2203200428023836020020042004290330370300200441d0006a41086a2209200328020036020020042004290300370350200441e0006a41086a20092802002203360200200441286a20033602002004200037031020042001370318200420042903502200370320200420003703602004410036025820044200370350200428024420042802406b220341306d21090240024002402003450d00200941d6aad52a4f0d01200441d8006a200310202207200941306c6a36020020042007360250200420073602542004280244200428024022096b22034101480d0020072009200310061a20042004280254200341306e41306c6a22073602540b200441106a20054101756a210302402005410171450d00200328020020066a28020021060b2004410036026820044200370360200720042802506b220741306d210502402007450d00200541d6aad52a4f0d02200441e8006a200710202207200541306c6a36020020042007360260200420073602642004280254200428025022096b22054101480d0020072009200510061a20042007200541306e41306c6a3602640b2003200441e0006a2006110300024020042802602207450d0020042007360264200710220b024020042802502207450d0020042007360254200710220b02402008418104490d002002101a0b024020042802402202450d0020042002360244200210220b200441f0006a240041010f0b200441d0006a1028000b200441e0006a1028000b130002402001102b0d00410041d9c20010020b0b0900200029030010070b870302067f017e23004180016b22032104200324002002280204210520022802002106024002400240024010042207450d002007418104490d012007101921020c020b410021020c020b20032007410f6a4170716b220224000b2002200710051a0b2004420037035020044200370348200442003703582004200236023c200420023602382004200220076a3602402004200441386a3602702004200441c8006a360218200441186a200441f0006a1040200441086a41086a2203200428024036020020042004290338370308200441e0006a41086a2208200328020036020020042004290308370360200441f0006a41086a20082802002203360200200441306a2003360200200420003703182004200137032020042004290360220037032820042000370370200441186a20054101756a210320042903582100200429035021012004290348210902402005410171450d00200328020020066a28020021060b2003200920012000200611050002402007418104490d002002101a0b20044180016a240041010bc00203017f017e027f230041c0006b2203240020032001370338200341306a41003602002003427f37032020034200370328200320002903002204370310200320043703180240024002402004200442808080809aecb4ee312001101022004100480d000240200341106a200010452200280230200341106a460d00410041b5c00010020b20032002360208200341106a20004200200341086a1046200328022822050d010c020b2003200236020c2003200341386a3602082003200341106a2001200341086a104720032802282205450d010b024002402003412c6a220628020022002005460d000340200041686a220028020021022000410036020002402002450d00200210220b20052000470d000b200341286a28020021000c010b200521000b2006200536020020001022200341c0006a24000f0b200341c0006a24000b9e0301057f23004180016b2203240020032204200229020037035841002102024010042205450d00024002402005418104490d002005101921020c010b20032005410f6a4170716b220224000b2002200510051a0b200441d0006a4100360200200442003703402004420037034820042002360234200420023602302004200220056a360238200221030240200541074b0d0041004185c1001002200428023421030b200441c0006a2003410810061a2004200341086a360234200441306a200441c0006a41086a220310431a200441086a2206200441306a41086a28020036020020042004290330370300200441e0006a41086a2207200628020036020020042004290300370360200441f0006a41086a20072802002206360200200441286a20063602002004200037031020042001370318200420042903602200370320200420003703702004200441d8006a3602742004200441106a360270200441f0006a200441c0006a104402402005418104490d002002101a0b024020032802002202450d00200441cc006a2002360200200210220b20044180016a240041010bc10201037f20002802002102024020012802002203280208200328020422046b41074b0d0041004185c1001002200341046a28020021040b20022004410810061a200341046a2203200328020041086a3602002000280200220041086a2102024020012802002203280208200328020422046b41074b0d0041004185c1001002200341046a28020021040b20022004410810061a200341046a2203200328020041086a360200200041106a2102024020012802002203280208200328020422046b41074b0d0041004185c1001002200341046a28020021040b20022004410810061a200341046a2203200328020041086a360200200041186a2100024020012802002201280208200128020422036b41074b0d0041004185c1001002200141046a28020021030b20002003410810061a200141046a2201200128020041086a3602000bf30101037f20002802002102024020012802002203280208200328020422046b41074b0d0041004185c1001002200341046a28020021040b20022004410810061a200341046a2203200328020041086a3602002000280200220441086a2102024020012802002203280208200328020422006b41074b0d0041004185c1001002200341046a28020021000b20022000410810061a200341046a2203200328020041086a360200200441106a2100024020012802002201280208200128020422036b41074b0d0041004185c1001002200141046a28020021030b20002003410810061a200141046a2201200128020041086a3602000be80303017f017e067f2000280204210242002103200041086a2104200041046a2105410021060340024020022004280200490d00410041fbc2001002200528020021020b20022d000021072005200241016a22023602002003200741ff0071200641ff0171220674ad842103200641076a2106200221022007418001710d000b02400240024020012802042208200128020022096b41306d22072003a722024f0d002001200220076b105620012802002209200141046a2802002208470d010c020b0240200720024d0d00200141046a2009200241306c6a22083602000b20092008460d010b200041046a22042802002102200041086a210103400240200128020020026b41074b0d0041004185c1001002200428020021020b20092002410810061a2004200428020041086a220236020041002105420021030340024020022001280200490d00410041fbc2001002200428020021020b20022d000021072004200241016a22063602002003200741ff0071200541ff0171220274ad842103200241076a2105200621022007418001710d000b200920033e02082009410c6a21020240200128020020066b41204b0d0041004185c1001002200428020021060b20022006412110061a2004200428020041216a2202360200200941306a22092008470d000b0b20000b920901047f02402000280208200028020422026b41074b0d0041004185c1001002200041046a28020021020b20012002410810061a200041046a2202200228020041086a2203360200200141086a21040240200041086a220528020020036b41034b0d0041004185c1001002200228020021030b20042003410410061a2002200228020041046a22033602002001410c6a21020240200528020020036b41034b0d0041004185c1001002200041046a28020021030b20022003410410061a200041046a2202200228020041046a2203360200200141106a21040240200041086a220528020020036b41034b0d0041004185c1001002200228020021030b20042003410410061a2002200228020041046a2203360200200141146a21020240200528020020036b41034b0d0041004185c1001002200041046a28020021030b20022003410410061a200041046a2202200228020041046a2203360200200141186a21040240200041086a220528020020036b41034b0d0041004185c1001002200228020021030b20042003410410061a2002200228020041046a22033602002001411c6a21020240200528020020036b41034b0d0041004185c1001002200041046a28020021030b20022003410410061a200041046a2202200228020041046a2203360200200141206a21040240200041086a220528020020036b41034b0d0041004185c1001002200228020021030b20042003410410061a2002200228020041046a2203360200200141246a21020240200528020020036b41034b0d0041004185c1001002200041046a28020021030b20022003410410061a200041046a2202200228020041046a2203360200200141286a21040240200041086a220528020020036b41034b0d0041004185c1001002200228020021030b20042003410410061a2002200228020041046a22033602002001412c6a21020240200528020020036b41034b0d0041004185c1001002200041046a28020021030b20022003410410061a200041046a2202200228020041046a2203360200200141306a21040240200041086a220528020020036b41034b0d0041004185c1001002200228020021030b20042003410410061a2002200228020041046a2203360200200141346a21020240200528020020036b41034b0d0041004185c1001002200041046a28020021030b20022003410410061a200041046a2202200228020041046a2203360200200141386a21040240200041086a220528020020036b41034b0d0041004185c1001002200228020021030b20042003410410061a2002200228020041046a22033602002001413c6a21020240200528020020036b41034b0d0041004185c1001002200041046a28020021030b20022003410410061a200041046a2202200228020041046a2203360200200141c0006a21040240200041086a220528020020036b41014b0d0041004185c1001002200228020021030b20042003410210061a2002200228020041026a2203360200200141c2006a21010240200528020020036b41014b0d0041004185c1001002200041046a28020021030b20012003410210061a200041046a2201200128020041026a36020020000ba10203017f017e057f2000280204210242002103200041086a2104200041046a2105410021060340024020022004280200490d00410041fbc2001002200528020021020b20022d000021072005200241016a22083602002003200741ff0071200641ff0171220274ad842103200241076a2106200821022007418001710d000b0240024020012802042207200128020022026b22052003a722064f0d002001200620056b1051200041046a2802002108200141046a2802002107200128020021020c010b200520064d0d00200141046a200220066a22073602000b0240200041086a28020020086b200720026b22074f0d0041004185c1001002200041046a28020021080b20022008200710061a200041046a2202200228020020076a36020020000bf80103017f017e027f230041106b22022400200242003703002002410036020820012903002103024002402001410c6a28020020012802086b2204450d002004417f4c0d01200241086a20041020220520046a36020020022005360200200220053602042001410c6a280200200141086a28020022046b22014101480d0020052004200110061a2002200520016a3602040b20002802002000280204220128020422044101756a21002001280200210102402004410171450d00200028020020016a28020021010b2000200320022001110100024020022802002201450d0020022001360204200110220b200241106a24000f0b20021028000bbf0302077f017e230041206b22022103200224000240200028021822042000411c6a2802002205460d0002400340200541786a2802002001460d012004200541686a2205470d000c020b0b20042005460d00200541686a2802002105200341206a240020050f0b02400240024020014100410010142204417f4c0d0020044181044f0d0120022004410f6a4170716b22022400410021060c020b410041eec00010020b200410192102410121060b20012002200410141a41c000102022052000360230200542003703000240200441074b0d0041004185c10010020b20052002410810061a200541106a2107200241086a21080240200441786a411f4b0d0041004185c10010020b20072008412010061a20052001360234200320053602182003200529030022093703102003200136020c0240024002402000411c6a22072802002204200041206a2802004f0d00200420093703082004200136021020034100360218200420053602002007200441186a36020020060d010c020b200041186a200341186a200341106a2003410c6a105d2006450d010b2002101a0b200328021821012003410036021802402001450d00200110220b200341206a240020050bc40103027f017e017f230022042105024020012802302000460d00410041bdc10010020b024020002903001013510d00410041ebc10010020b20012903002106200328020022032802002207200328020420076b200141106a22071015024020062001290300510d004100419ec20010020b2004220441506a2203240020032001410810061a200441586a2007412010061a20012802342002200341281017024020062000290310540d00200041106a427e200642017c2006427d561b3703000b200524000bfb0101047f230041306b2204240020042002370328024020012903001013510d004100418ac10010020b20042003360214200420013602102004200441286a36021841c000102022032001200441106a105c1a2004200336022020042003290300220237031020042003280234220536020c024002402001411c6a22062802002207200141206a2802004f0d00200720023703082007200536021020044100360220200720033602002006200741186a3602000c010b200141186a200441206a200441106a2004410c6a105d0b2000200336020420002001360200200428022021012004410036022002402001450d00200110220b200441306a24000b960305027f017e017f017e017f230041d0006b2202240020002802002103024020012802002201280208200128020422006b411f4b0d0041004185c1001002200141046a28020021000b200241306a2000412010061a200141046a2201200128020041206a3602004200210441102101200241106a2105410021004200210602400340200241306a20006a2107024020014102490d002006420886200420073100008422044238888421062001417f6a210120044208862104200041016a22004120470d010c020b024020014101460d00410041ffc20010020b200520063703082005200420073100008437030041102101200541106a21054200210442002106200041016a22004120470d000b0b024020014110460d00024020014102490d00200220042006200141037441786a1011200241086a2903002106200229030021040b20052004370300200520063703080b20032002290310370300200341086a2002290318370300200341186a200241106a41186a290300370300200341106a200241106a41106a290300370300200241d0006a24000bba0101047f230041106b22022103200224000240024002400240024010042204450d002004418004490d012004101921020c020b2003420037030841002102200341086a21050c020b20022004410f6a4170716b220224000b2002200410051a20034200370308200341086a2105200441074b0d010b41004185c10010020b20052002410810061a20034200370300200241086a2102024020044178714108470d0041004185c10010020b20032002410810061a200341106a24000b4401037f230022022103024010042204450d00024002402004418004490d002004101921020c010b20022004410f6a4170716b220224000b2002200410051a0b200324000b4401037f230022022103024010042204450d00024002402004418004490d002004101921020c010b20022004410f6a4170716b220224000b2002200410051a0b200324000b4401037f230022022103024010042204450d00024002402004418004490d002004101921020c010b20022004410f6a4170716b220224000b2002200410051a0b200324000b4401037f230022022103024010042204450d00024002402004418004490d002004101921020c010b20022004410f6a4170716b220224000b2002200410051a0b200324000b4401037f230022022103024010042204450d00024002402004418004490d002004101921020c010b20022004410f6a4170716b220224000b2002200410051a0b200324000b4401037f230022022103024010042204450d00024002402004418004490d002004101921020c010b20022004410f6a4170716b220224000b2002200410051a0b200324000bd30201047f230041306b2202210320022400024002400240024010042204450d002004418004490d012004101921020c020b410021020c020b20022004410f6a4170716b220224000b2002200410051a0b20032002360224200320023602202003200220046a2205360228200342003703180240200441074b0d0041004185c1001002200341286a2802002105200328022421020b200341186a2002410810061a2003200241086a2202360224024020052002470d0041004185c1001002200341206a41086a2802002105200328022421020b200341176a2002410110061a2003200241016a2202360224024020052002470d0041004185c1001002200328022421020b200341166a2002410110061a2003200241016a3602242003410036021020034200370308200341206a200341086a10431a024020032802082202450d002003200236020c200210220b200341306a24000bbe0201067f0240024002400240024020002802082202200028020422036b20014f0d002003200028020022046b220520016a2206417f4c0d0241ffffffff0721070240200220046b220241feffffff034b0d0020062002410174220220022006491b2207450d020b2007102021020c030b200041046a21000340200341003a00002000200028020041016a22033602002001417f6a22010d000c040b0b41002107410021020c010b20001028000b200220076a2107200320016a20046b2104200220056a220521030340200341003a0000200341016a21032001417f6a22010d000b200220046a21042005200041046a2206280200200028020022016b22036b2102024020034101480d0020022001200310061a200028020021010b2000200236020020062004360200200041086a20073602002001450d00200110220f0b0bd00102047f017e230041106b22022103200224000240024002400240024010042204450d002004418004490d012004101921020c020b2003420037030841002102200341086a21050c020b20022004410f6a4170716b220224000b2002200410051a20034200370308200341086a2105200441074b0d010b41004185c10010020b20052002410810061a200241086a2102024020044108470d0041004185c10010020b200341076a2002410110061a2003290308210620032d0007210420001007200620044100471008200341106a24000bab0202047f047e230041206b22022103200224000240024002400240024010042204450d002004418004490d012004101921020c020b2003420037031841002102200341186a21050c020b20022004410f6a4170716b220224000b2002200410051a20034200370318200341186a2105200441074b0d010b41004185c10010020b20052002410810061a200241086a21050240200441787122044108470d0041004185c10010020b200341106a2005410810061a200241106a2105024020044110470d0041004185c10010020b200341086a2005410810061a200241186a2102024020044118470d0041004185c10010020b20032002410810061a200329030021062003290308210720032903102108200329031821092000100720092008200720061009200341206a24000bd30101047f230041206b22022103200224000240024002400240024010042204450d002004418004490d012004101921020c020b41002102200341186a21050c020b20022004410f6a4170716b220224000b2002200410051a200341186a2105200441074b0d010b41004185c10010020b20052002410810061a200241086a21050240200441787122044108470d0041004185c10010020b200341106a2005410810061a200241106a2102024020044110470d0041004185c10010020b200341086a2002410810061a20001007200341206a24000bc60301047f23004180016b220221032002240041002104024010042205450d00024002402005418004490d002005101921040c010b20022005410f6a4170716b220424000b2004200510051a0b20032004360254200320043602502003200420056a3602582003410036024820034200370340200341d0006a200341c0006a10411a200341106a41086a2204200328025836020020032003290350370310200341e0006a41086a2205200428020036020020032003290310370360200341f0006a41086a20052802002204360200200341386a20043602002003200037032020032001370328200320032903602200370330200320003703702003410036020820034200370300200328024420032802406b220441306d2105024002402004450d00200541d6aad52a4f0d01200341086a200410202204200541306c6a36020020032004360200200320043602042003280244200328024022026b22054101480d0020042002200510061a20032003280204200541306e41306c6a3602040b200341206a20031038024020032802002204450d0020032004360204200410220b024020032802402204450d0020032004360244200410220b20034180016a24000f0b20031028000bc60301067f0240024002400240024020002802082202200028020422036b41306d20014f0d002003200028020022046b41306d220520016a220641d6aad52a4f0d0241d5aad52a21030240200220046b41306d220241a9d5aa154b0d0020062002410174220320032006491b2203450d020b200341306c102021040c030b200041046a21020340200341086a2200420037030020034200370300200341286a4200370300200341206a4200370300200341186a4200370300200341106a4200370300200041003602002002200228020041306a22033602002001417f6a22010d000c040b0b41002103410021040c010b20001028000b2004200341306c6a21072004200541306c6a220521030340200341086a2202420037030020034200370300200341286a4200370300200341206a4200370300200341186a4200370300200341106a420037030020024100360200200341306a21032001417f6a22010d000b2004200641306c6a21042005200041046a2206280200200028020022036b220141506d41306c6a2102024020014101480d0020022003200110061a200028020021030b2000200236020020062004360200200041086a20073602002003450d00200310220f0b0b8a0101037f230041e0006b2202210320022400024002400240024010042204450d002004418004490d012004101921020c020b410021020c020b20022004410f6a4170716b220224000b2002200410051a0b20032002360254200320023602502003200220046a360258200341d0006a200341086a10421a20001007200341086a1029200341e0006a24000b950101047f230041106b22022103200224000240024002400240024010042204450d002004418004490d012004101921020c020b2003420037030841002102200341086a21050c020b20022004410f6a4170716b220224000b2002200410051a20034200370308200341086a2105200441074b0d010b41004185c10010020b20052002410810061a20032903081007200341106a24000bd70303047f027e017f230041f0006b2202210320022400024002400240024010042204450d002004418004490d012004101921050c020b410021050c020b20022004410f6a4170716b220524000b2005200410051a0b42002106200341286a420037030041102102200341106a41106a4200370300200342003703182003420037031002402004411f4b0d0041004185c10010020b200341d0006a2005412010061a200341306a2105410021044200210702400340200341d0006a20046a2108024020024102490d002007420886200620083100008422064238888421072002417f6a210220064208862106200441016a22044120470d010c020b024020024101460d00410041ffc20010020b200520073703082005200620083100008437030041102102200541106a21054200210642002107200441016a22044120470d000b0b024020024110460d00024020024102490d00200320062007200241037441786a1011200341086a2903002107200329030021060b20052006370300200520073703080b200341106a41186a200341306a41186a290300370300200341106a41106a200341306a41106a290300370300200320032903383703182003200329033037031020001007200341106a102c200341f0006a24000be00303047f027e017f230041f0006b2202210320022400024002400240024010042204450d002004418004490d012004101921050c020b410021050c020b20022004410f6a4170716b220524000b2005200410051a0b42002106200341286a420037030041102102200341106a41106a4200370300200342003703182003420037031002402004411f4b0d0041004185c10010020b200341d0006a2005412010061a200341306a2105410021044200210702400340200341d0006a20046a2108024020024102490d002007420886200620083100008422064238888421072002417f6a210220064208862106200441016a22044120470d010c020b024020024101460d00410041ffc20010020b200520073703082005200620083100008437030041102102200541106a21054200210642002107200441016a22044120470d000b0b024020024110460d00024020024102490d00200320062007200241037441786a1011200341086a2903002107200329030021060b20052006370300200520073703080b200341106a41186a200341306a41186a290300370300200341106a41106a200341306a41106a29030037030020032003290338370318200320032903303703100240200341106a102b0d00410041d9c20010020b200341f0006a24000beb0201037f23004180016b2202210320022400024002400240024010042204450d002004418004490d012004101921020c020b410021020c020b20022004410f6a4170716b220224000b2002200410051a0b20032002360254200320023602502003200220046a360258200342003703480240200441074b0d0041004185c1001002200328025421020b200341c8006a2002410810061a2003200241086a3602542003410036024020034200370338200341d0006a200341386a10431a200341086a41086a2202200341d0006a41086a28020036020020032003290350370308200341e0006a41086a2204200228020036020020032003290308370360200341f0006a41086a20042802002202360200200341306a2002360200200320003703182003200137032020032003290360220037032820032000370370200341186a2003290348200341386a103d024020032802382202450d002003200236023c200210220b20034180016a24000bbc0102037f017e230041306b22032400200020013602302000420037030020002002280204220428020029030037030020022802002101200428020422042802002205200428020420056b200041106a2204101520032000410810061a20034108722004412010061a2000200129030842808080809aecb4ee31200228020829030020002903002206200341281016360234024020062001290310540d00200141106a427e200642017c2006427d561b3703000b200341306a240020000baa0301057f024002402000280204200028020022046b41186d220541016a220641abd5aad5004f0d0041aad5aad500210702400240200028020820046b41186d220441d4aad52a4b0d0020062004410174220720072006491b2207450d010b200741186c102021040c020b41002107410021040c010b20001028000b20012802002106200141003602002004200541186c22086a2201200636020020012002290300370308200120032802003602102004200741186c6a2105200141186a210602400240200041046a280200220220002802002207460d00200420086a41686a21010340200241686a220428020021032004410036020020012003360200200141106a200241786a280200360200200141086a200241706a290300370300200141686a21012004210220072004470d000b200141186a2101200041046a2802002107200028020021020c010b200721020b20002001360200200041046a2006360200200041086a2005360200024020072002460d000340200741686a220728020021012007410036020002402001450d00200110220b20022007470d000b0b02402002450d00200210220b0b0bdf030b00419cc0000b4c6661696c656420746f20616c6c6f63617465207061676573006f626a6563742070617373656420746f206974657261746f725f746f206973206e6f7420696e206d756c74695f696e646578000041e8c0000b1d7772697465006572726f722072656164696e67206974657261746f7200004185c1000b05726561640000418ac1000b3363616e6e6f7420637265617465206f626a6563747320696e207461626c65206f6620616e6f7468657220636f6e7472616374000041bdc1000b2e6f626a6563742070617373656420746f206d6f64696679206973206e6f7420696e206d756c74695f696e646578000041ebc1000b3363616e6e6f74206d6f64696679206f626a6563747320696e207461626c65206f6620616e6f7468657220636f6e74726163740000419ec2000b3b757064617465722063616e6e6f74206368616e6765207072696d617279206b6579207768656e206d6f64696679696e6720616e206f626a656374000041d9c2000b2270726f746f636f6c2066656174757265206973206e6f7420616374697661746564000041fbc2000b04676574000041ffc2000b2c756e6578706563746564206572726f7220696e2066697865645f627974657320636f6e7374727563746f72000041000b04b02100000000000000000000000003917c562680b415b93db73416ff29230dfbe7ab1ba4d208b46029d01333cd3a03000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d91010000000000ea30556ab602000000000000000000000000 +DMLOG APPLIED_TRANSACTION 3 03917c562680b415b93db73416ff29230dfbe7ab1ba4d208b46029d01333cd3a03000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440100d0070000fb050000000000000000d8170000000000000001010000010000000000ea30559a90c525172f87bbac0a6378610727f0fe1d7ebe908df973923d29a1606f9a5703000000000000000300000000000000010000000000ea3055030000000000000001000000000000ea30550000000000ea305500000040258ab2c2010000000000ea305500000000a8ed3232fe8a010000000000ea30550000f18a010061736d01000000019d011a60000060037f7e7f0060027f7e0060027f7f0060057f7e7e7e7e0060047f7e7e7e0060017f017f60017f0060037f7f7f017f6000017f60027f7f017f60017e0060027e7f0060047e7e7e7e0060027f7f017e6000017e60047e7e7e7e017f60047f7e7e7f0060037f7f7f0060067e7e7e7e7f7f017f60047f7e7f7f0060037e7e7e0060037e7e7f017f60047f7f7e7f0060027e7e0060047f7f7f7f00028e041803656e761469735f666561747572655f616374697661746564000603656e761370726561637469766174655f66656174757265000703656e760c656f73696f5f617373657274000303656e76066d656d736574000803656e7610616374696f6e5f646174615f73697a65000903656e7610726561645f616374696f6e5f64617461000a03656e76066d656d637079000803656e760c726571756972655f61757468000b03656e760e7365745f70726976696c65676564000c03656e76137365745f7265736f757263655f6c696d697473000d03656e760561626f7274000003656e76167365745f70726f706f7365645f70726f647563657273000e03656e76207365745f626c6f636b636861696e5f706172616d65746572735f7061636b6564000303656e76206765745f626c6f636b636861696e5f706172616d65746572735f7061636b6564000a03656e760c63757272656e745f74696d65000f03656e76146765745f6163746976655f70726f647563657273000a03656e760b64625f66696e645f693634001003656e76095f5f6173686c746933001103656e7611656f73696f5f6173736572745f636f6465000203656e761063757272656e745f7265636569766572000f03656e760a64625f6765745f693634000803656e7606736861323536001203656e760c64625f73746f72655f693634001303656e760d64625f7570646174655f69363400140347460006070007090a08060607070a0a030307070a060715011602160316041603160316030516011603030a0a0a030a17170318181818181818180318181818031818181818081904050170010a0a05030100010616037f014180c0000b7f0041abc3000b7f0041abc3000b070901056170706c79002d090f010041010b092e30323436383a3b3d0ac98001460400101b0b800101037f02400240024002402000450d004100410028028c40200041107622016a220236028c404100410028028440220320006a41076a417871220036028440200241107420004d0d0120014000417f460d020c030b41000f0b4100200241016a36028c40200141016a4000417f470d010b4100419cc000100220030f0b20030b02000b3601017f230041106b2200410036020c4100200028020c28020041076a417871220036028440410020003602804041003f0036028c400b02000b06004190c0000bf50101067f4100210202400240410020006b22032000712000470d00200041104b0d01200110190f0b101d411636020041000f0b0240024002402000417f6a220420016a10192200450d002000200420006a2003712202460d012000417c6a220328020022044107712201450d02200020044178716a220441786a2205280200210620032001200220006b2207723602002002417c6a200420026b2203200172360200200241786a20064107712201200772360200200520012003723602002000101a0b20020f0b20000f0b200241786a200041786a280200200220006b22006a3602002002417c6a200328020020006b36020020020b3301017f411621030240024020014104490d0020012002101e2201450d0120002001360200410021030b20030f0b101d2802000b3801027f02402000410120001b2201101922000d000340410021004100280298402202450d012002110000200110192200450d000b0b20000b0600200010200b0e0002402000450d002000101a0b0b0600200010220b6b01027f230041106b2202240002402002410c6a20014104200141044b1b22012000410120001b2203101f450d00024003404100280298402200450d0120001100002002410c6a20012003101f0d000c020b0b2002410036020c0b200228020c2100200241106a240020000b08002000200110240b0e0002402000450d002000101a0b0b08002000200110260b0500100a000b4e01017f230041e0006b220124002001200141d8006a3602082001200141106a3602042001200141106a36020020012000102a1a200141106a200128020420012802006b100c200141e0006a24000b920901047f02402000280208200028020422026b41074a0d00410041e8c0001002200041046a28020021020b20022001410810061a200041046a2202200228020041086a2203360200200141086a21040240200041086a220528020020036b41034a0d00410041e8c0001002200228020021030b20032004410410061a2002200228020041046a22033602002001410c6a21020240200528020020036b41034a0d00410041e8c0001002200041046a28020021030b20032002410410061a200041046a2202200228020041046a2203360200200141106a21040240200041086a220528020020036b41034a0d00410041e8c0001002200228020021030b20032004410410061a2002200228020041046a2203360200200141146a21020240200528020020036b41034a0d00410041e8c0001002200041046a28020021030b20032002410410061a200041046a2202200228020041046a2203360200200141186a21040240200041086a220528020020036b41034a0d00410041e8c0001002200228020021030b20032004410410061a2002200228020041046a22033602002001411c6a21020240200528020020036b41034a0d00410041e8c0001002200041046a28020021030b20032002410410061a200041046a2202200228020041046a2203360200200141206a21040240200041086a220528020020036b41034a0d00410041e8c0001002200228020021030b20032004410410061a2002200228020041046a2203360200200141246a21020240200528020020036b41034a0d00410041e8c0001002200041046a28020021030b20032002410410061a200041046a2202200228020041046a2203360200200141286a21040240200041086a220528020020036b41034a0d00410041e8c0001002200228020021030b20032004410410061a2002200228020041046a22033602002001412c6a21020240200528020020036b41034a0d00410041e8c0001002200041046a28020021030b20032002410410061a200041046a2202200228020041046a2203360200200141306a21040240200041086a220528020020036b41034a0d00410041e8c0001002200228020021030b20032004410410061a2002200228020041046a2203360200200141346a21020240200528020020036b41034a0d00410041e8c0001002200041046a28020021030b20032002410410061a200041046a2202200228020041046a2203360200200141386a21040240200041086a220528020020036b41034a0d00410041e8c0001002200228020021030b20032004410410061a2002200228020041046a22033602002001413c6a21020240200528020020036b41034a0d00410041e8c0001002200041046a28020021030b20032002410410061a200041046a2202200228020041046a2203360200200141c0006a21040240200041086a220528020020036b41014a0d00410041e8c0001002200228020021030b20032004410210061a2002200228020041026a2203360200200141c2006a21010240200528020020036b41014a0d00410041e8c0001002200041046a28020021030b20032001410210061a200041046a2201200128020041026a36020020000bfa0203017f027e017f230041206b220124002001200029030022024220883c000b200120024228883c000a200120024230883c0009200120024238883c00082001200041086a29030022034220883c0003200120034228883c0002200120034230883c0001200120034238883c000020012002a722043a000f200120044108763a000e200120044110763a000d200120044118763a000c20012003a722043a0007200120044108763a0006200120044110763a0005200120044118763a00042001200041186a29030022023c00172001200029031022034220883c001b200120034228883c001a200120034230883c0019200120034238883c0018200120024220883c0013200120024228883c0012200120024230883c0011200120024238883c001020012002a722004108763a0016200120004110763a0015200120004118763a001420012003a722003a001f200120004108763a001e200120004110763a001d200120004118763a001c200110002100200141206a240020000bf60203017f027e017f230041206b220124002001200029030022024220883c000b200120024228883c000a200120024230883c0009200120024238883c00082001200041086a29030022034220883c0003200120034228883c0002200120034230883c0001200120034238883c000020012002a722043a000f200120044108763a000e200120044110763a000d200120044118763a000c20012003a722043a0007200120044108763a0006200120044110763a0005200120044118763a00042001200041186a29030022023c00172001200029031022034220883c001b200120034228883c001a200120034230883c0019200120034238883c0018200120024220883c0013200120024228883c0012200120024230883c0011200120024238883c001020012002a722004108763a0016200120004110763a0015200120004118763a001420012003a722003a001f200120004108763a001e200120004110763a001d200120004118763a001c20011001200141206a24000bcc0401017f23004190016b220324001018024020012000520d0002400240024002400240024002400240200242ffffb7f6a497b2d942570d00200242ffffffffb5f7d6d942570d01200242808080d0b2b3bb9932510d03200242808080c093fad6d942510d0420024280808080b6f7d6d942520d082003410036028c0120034101360288012003200329038801370300200120012003102f1a0c080b200242fffffffffff698d942550d0120024290a9d9d9dd8c99d6ba7f510d0420024280808080daac9bd6ba7f520d0720034100360264200341023602602003200329036037032820012001200341286a10311a0c070b2002428080b8f6a497b2d942510d0420024280808096cdebd4d942520d062003410036026c200341033602682003200329036837032020012001200341206a10331a0c060b2002428080808080f798d942510d042002428080b8f6a4979ad942520d0520034100360284012003410436028001200320032903800137030820012001200341086a10351a0c050b20034100360254200341053602502003200329035037033820012001200341386a10371a0c040b20034100360274200341063602702003200329037037031820012001200341186a10391a0c030b2003410036024c200341073602482003200329034837034020012001200341c0006a10371a0c020b2003410036027c200341083602782003200329037837031020012001200341106a103c1a0c010b2003410036025c200341093602582003200329035837033020012001200341306a103e1a0b4100101c20034190016a24000b1200200029030010072001200241004710080bd30201077f230041306b2203210420032400200228020421052002280200210641002102024010042207450d00024002402007418104490d002007101921020c010b20032007410f6a4170716b220224000b2002200710051a0b200441003a002820044200370320200220076a2103200441206a41086a210802400240200741074b0d0041004185c1001002200441206a2002410810061a200241086a21090c010b200441206a2002410810061a200241086a210920074108470d0041004185c10010020b20082009410110061a200441186a200336020020042002360210200441146a200241096a3602002004200137030820042000370300200420054101756a2103200441286a2d000021082004290320210002402005410171450d00200328020020066a28020021060b20032000200841ff0171200611010002402007418104490d002002101a0b200441306a240041010b0600200110070b830201057f230041306b22032104200324002002280204210520022802002106024002400240024010042207450d002007418104490d012007101921020c020b410021020c020b20032007410f6a4170716b220224000b2002200710051a0b20044200370328200220076a21030240200741074b0d0041004185c10010020b200441286a2002410810061a2004411c6a200241086a360200200441206a2003360200200420013703102004200037030820042002360218200441086a20054101756a21032004290328210002402005410171450d00200328020020066a28020021060b20032000200611020002402007418104490d002002101a0b200441306a240041010b0d0020002903001007200110290bf70201067f230041a0026b2203210420032400200228020421052002280200210641002102024010042207450d00024002402007418104490d002007101921020c010b20032007410f6a4170716b220224000b2002200710051a0b200441c8006a410041c80010031a2004200236023c200420023602382004200220076a360240200441386a200441c8006a10421a200441086a41086a220320042802403602002004200429033837030820044190016a41086a220820032802003602002004200429030837039001200441d8016a41086a20082802002203360200200441306a2003360200200420003703182004200137032020042004290390012200370328200420003703d80120044190016a200441c8006a41c80010061a200441d8016a20044190016a41c80010061a200441186a20054101756a210302402005410171450d00200328020020066a28020021060b2003200441d8016a200611030002402007418104490d002002101a0b200441a0026a240041010b130020002903001007200120022003200410090b940302067f027e23004180016b22032104200324002002280204210520022802002106024002400240024010042207450d002007418104490d012007101921020c020b410021020c020b20032007410f6a4170716b220224000b2002200710051a0b2004420037034820044200370340200442003703502004420037035820042002360234200420023602302004200220076a3602382004200441306a3602702004200441c0006a360210200441106a200441f0006a103f200441086a2203200428023836020020042004290330370300200441e0006a41086a2208200328020036020020042004290300370360200441f0006a41086a20082802002203360200200441286a2003360200200420003703102004200137031820042004290360220037032020042000370370200441106a20054101756a21032004290358210020042903502101200429034821092004290340210a02402005410171450d00200328020020066a28020021060b2003200a200920012000200611040002402007418104490d002002101a0b20044180016a240041010b0d00200029030010072001102c0bfe0301087f230041a0016b22032104200324002002280204210520022802002106024002400240024010042207450d002007418104490d012007101921020c020b410021020c020b20032007410f6a4170716b220224000b2002200710051a0b200441c0006a41186a22034200370300200441c0006a41106a22084200370300200442003703482004420037034020042002360234200420023602302004200220076a3602382004200441306a3602602004200441c0006a3602800120044180016a200441e0006a1048200441086a2209200428023836020020042004290330370300200441e0006a41086a220a20092802003602002004200429030037036020044180016a41086a200a2802002209360200200441106a41186a200936020020042000370310200420013703182004200429036022003703202004200037038001200441e0006a41186a22092003290300370300200441e0006a41106a22032008290300370300200420042903483703682004200429034037036020044180016a41186a200929030037030020044180016a41106a200329030037030020042004290368370388012004200429036037038001200441106a20054101756a210302402005410171450d00200328020020066a28020021060b200320044180016a200611030002402007418104490d002002101a0b200441a0016a240041010b5601027f23002202210320002903001007024010042200418104490d00200010192202200010051a20022000100b1a200324000f0b20022000410f6a4170716b220224002002200010051a20022000100b1a200324000bb80501077f230041f0006b220321042003240020022802042105200228020021064100210741002102024010042208450d00024002402008418104490d002008101921020c010b20032008410f6a4170716b220224000b2002200810051a0b200441003602482004420037034020042002360234200420023602302004200220086a360238200441306a200441c0006a10411a200441086a2203200428023836020020042004290330370300200441d0006a41086a2209200328020036020020042004290300370350200441e0006a41086a20092802002203360200200441286a20033602002004200037031020042001370318200420042903502200370320200420003703602004410036025820044200370350200428024420042802406b220341306d21090240024002402003450d00200941d6aad52a4f0d01200441d8006a200310202207200941306c6a36020020042007360250200420073602542004280244200428024022096b22034101480d0020072009200310061a20042004280254200341306e41306c6a22073602540b200441106a20054101756a210302402005410171450d00200328020020066a28020021060b2004410036026820044200370360200720042802506b220741306d210502402007450d00200541d6aad52a4f0d02200441e8006a200710202207200541306c6a36020020042007360260200420073602642004280254200428025022096b22054101480d0020072009200510061a20042007200541306e41306c6a3602640b2003200441e0006a2006110300024020042802602207450d0020042007360264200710220b024020042802502207450d0020042007360254200710220b02402008418104490d002002101a0b024020042802402202450d0020042002360244200210220b200441f0006a240041010f0b200441d0006a1028000b200441e0006a1028000b130002402001102b0d00410041d9c20010020b0b0900200029030010070b870302067f017e23004180016b22032104200324002002280204210520022802002106024002400240024010042207450d002007418104490d012007101921020c020b410021020c020b20032007410f6a4170716b220224000b2002200710051a0b2004420037035020044200370348200442003703582004200236023c200420023602382004200220076a3602402004200441386a3602702004200441c8006a360218200441186a200441f0006a1040200441086a41086a2203200428024036020020042004290338370308200441e0006a41086a2208200328020036020020042004290308370360200441f0006a41086a20082802002203360200200441306a2003360200200420003703182004200137032020042004290360220037032820042000370370200441186a20054101756a210320042903582100200429035021012004290348210902402005410171450d00200328020020066a28020021060b2003200920012000200611050002402007418104490d002002101a0b20044180016a240041010bc00203017f017e027f230041c0006b2203240020032001370338200341306a41003602002003427f37032020034200370328200320002903002204370310200320043703180240024002402004200442808080809aecb4ee312001101022004100480d000240200341106a200010452200280230200341106a460d00410041b5c00010020b20032002360208200341106a20004200200341086a1046200328022822050d010c020b2003200236020c2003200341386a3602082003200341106a2001200341086a104720032802282205450d010b024002402003412c6a220628020022002005460d000340200041686a220028020021022000410036020002402002450d00200210220b20052000470d000b200341286a28020021000c010b200521000b2006200536020020001022200341c0006a24000f0b200341c0006a24000b9e0301057f23004180016b2203240020032204200229020037035841002102024010042205450d00024002402005418104490d002005101921020c010b20032005410f6a4170716b220224000b2002200510051a0b200441d0006a4100360200200442003703402004420037034820042002360234200420023602302004200220056a360238200221030240200541074b0d0041004185c1001002200428023421030b200441c0006a2003410810061a2004200341086a360234200441306a200441c0006a41086a220310431a200441086a2206200441306a41086a28020036020020042004290330370300200441e0006a41086a2207200628020036020020042004290300370360200441f0006a41086a20072802002206360200200441286a20063602002004200037031020042001370318200420042903602200370320200420003703702004200441d8006a3602742004200441106a360270200441f0006a200441c0006a104402402005418104490d002002101a0b024020032802002202450d00200441cc006a2002360200200210220b20044180016a240041010bc10201037f20002802002102024020012802002203280208200328020422046b41074b0d0041004185c1001002200341046a28020021040b20022004410810061a200341046a2203200328020041086a3602002000280200220041086a2102024020012802002203280208200328020422046b41074b0d0041004185c1001002200341046a28020021040b20022004410810061a200341046a2203200328020041086a360200200041106a2102024020012802002203280208200328020422046b41074b0d0041004185c1001002200341046a28020021040b20022004410810061a200341046a2203200328020041086a360200200041186a2100024020012802002201280208200128020422036b41074b0d0041004185c1001002200141046a28020021030b20002003410810061a200141046a2201200128020041086a3602000bf30101037f20002802002102024020012802002203280208200328020422046b41074b0d0041004185c1001002200341046a28020021040b20022004410810061a200341046a2203200328020041086a3602002000280200220441086a2102024020012802002203280208200328020422006b41074b0d0041004185c1001002200341046a28020021000b20022000410810061a200341046a2203200328020041086a360200200441106a2100024020012802002201280208200128020422036b41074b0d0041004185c1001002200141046a28020021030b20002003410810061a200141046a2201200128020041086a3602000be80303017f017e067f2000280204210242002103200041086a2104200041046a2105410021060340024020022004280200490d00410041fbc2001002200528020021020b20022d000021072005200241016a22023602002003200741ff0071200641ff0171220674ad842103200641076a2106200221022007418001710d000b02400240024020012802042208200128020022096b41306d22072003a722024f0d002001200220076b105620012802002209200141046a2802002208470d010c020b0240200720024d0d00200141046a2009200241306c6a22083602000b20092008460d010b200041046a22042802002102200041086a210103400240200128020020026b41074b0d0041004185c1001002200428020021020b20092002410810061a2004200428020041086a220236020041002105420021030340024020022001280200490d00410041fbc2001002200428020021020b20022d000021072004200241016a22063602002003200741ff0071200541ff0171220274ad842103200241076a2105200621022007418001710d000b200920033e02082009410c6a21020240200128020020066b41204b0d0041004185c1001002200428020021060b20022006412110061a2004200428020041216a2202360200200941306a22092008470d000b0b20000b920901047f02402000280208200028020422026b41074b0d0041004185c1001002200041046a28020021020b20012002410810061a200041046a2202200228020041086a2203360200200141086a21040240200041086a220528020020036b41034b0d0041004185c1001002200228020021030b20042003410410061a2002200228020041046a22033602002001410c6a21020240200528020020036b41034b0d0041004185c1001002200041046a28020021030b20022003410410061a200041046a2202200228020041046a2203360200200141106a21040240200041086a220528020020036b41034b0d0041004185c1001002200228020021030b20042003410410061a2002200228020041046a2203360200200141146a21020240200528020020036b41034b0d0041004185c1001002200041046a28020021030b20022003410410061a200041046a2202200228020041046a2203360200200141186a21040240200041086a220528020020036b41034b0d0041004185c1001002200228020021030b20042003410410061a2002200228020041046a22033602002001411c6a21020240200528020020036b41034b0d0041004185c1001002200041046a28020021030b20022003410410061a200041046a2202200228020041046a2203360200200141206a21040240200041086a220528020020036b41034b0d0041004185c1001002200228020021030b20042003410410061a2002200228020041046a2203360200200141246a21020240200528020020036b41034b0d0041004185c1001002200041046a28020021030b20022003410410061a200041046a2202200228020041046a2203360200200141286a21040240200041086a220528020020036b41034b0d0041004185c1001002200228020021030b20042003410410061a2002200228020041046a22033602002001412c6a21020240200528020020036b41034b0d0041004185c1001002200041046a28020021030b20022003410410061a200041046a2202200228020041046a2203360200200141306a21040240200041086a220528020020036b41034b0d0041004185c1001002200228020021030b20042003410410061a2002200228020041046a2203360200200141346a21020240200528020020036b41034b0d0041004185c1001002200041046a28020021030b20022003410410061a200041046a2202200228020041046a2203360200200141386a21040240200041086a220528020020036b41034b0d0041004185c1001002200228020021030b20042003410410061a2002200228020041046a22033602002001413c6a21020240200528020020036b41034b0d0041004185c1001002200041046a28020021030b20022003410410061a200041046a2202200228020041046a2203360200200141c0006a21040240200041086a220528020020036b41014b0d0041004185c1001002200228020021030b20042003410210061a2002200228020041026a2203360200200141c2006a21010240200528020020036b41014b0d0041004185c1001002200041046a28020021030b20012003410210061a200041046a2201200128020041026a36020020000ba10203017f017e057f2000280204210242002103200041086a2104200041046a2105410021060340024020022004280200490d00410041fbc2001002200528020021020b20022d000021072005200241016a22083602002003200741ff0071200641ff0171220274ad842103200241076a2106200821022007418001710d000b0240024020012802042207200128020022026b22052003a722064f0d002001200620056b1051200041046a2802002108200141046a2802002107200128020021020c010b200520064d0d00200141046a200220066a22073602000b0240200041086a28020020086b200720026b22074f0d0041004185c1001002200041046a28020021080b20022008200710061a200041046a2202200228020020076a36020020000bf80103017f017e027f230041106b22022400200242003703002002410036020820012903002103024002402001410c6a28020020012802086b2204450d002004417f4c0d01200241086a20041020220520046a36020020022005360200200220053602042001410c6a280200200141086a28020022046b22014101480d0020052004200110061a2002200520016a3602040b20002802002000280204220128020422044101756a21002001280200210102402004410171450d00200028020020016a28020021010b2000200320022001110100024020022802002201450d0020022001360204200110220b200241106a24000f0b20021028000bbf0302077f017e230041206b22022103200224000240200028021822042000411c6a2802002205460d0002400340200541786a2802002001460d012004200541686a2205470d000c020b0b20042005460d00200541686a2802002105200341206a240020050f0b02400240024020014100410010142204417f4c0d0020044181044f0d0120022004410f6a4170716b22022400410021060c020b410041eec00010020b200410192102410121060b20012002200410141a41c000102022052000360230200542003703000240200441074b0d0041004185c10010020b20052002410810061a200541106a2107200241086a21080240200441786a411f4b0d0041004185c10010020b20072008412010061a20052001360234200320053602182003200529030022093703102003200136020c0240024002402000411c6a22072802002204200041206a2802004f0d00200420093703082004200136021020034100360218200420053602002007200441186a36020020060d010c020b200041186a200341186a200341106a2003410c6a105d2006450d010b2002101a0b200328021821012003410036021802402001450d00200110220b200341206a240020050bc40103027f017e017f230022042105024020012802302000460d00410041bdc10010020b024020002903001013510d00410041ebc10010020b20012903002106200328020022032802002207200328020420076b200141106a22071015024020062001290300510d004100419ec20010020b2004220441506a2203240020032001410810061a200441586a2007412010061a20012802342002200341281017024020062000290310540d00200041106a427e200642017c2006427d561b3703000b200524000bfb0101047f230041306b2204240020042002370328024020012903001013510d004100418ac10010020b20042003360214200420013602102004200441286a36021841c000102022032001200441106a105c1a2004200336022020042003290300220237031020042003280234220536020c024002402001411c6a22062802002207200141206a2802004f0d00200720023703082007200536021020044100360220200720033602002006200741186a3602000c010b200141186a200441206a200441106a2004410c6a105d0b2000200336020420002001360200200428022021012004410036022002402001450d00200110220b200441306a24000b960305027f017e017f017e017f230041d0006b2202240020002802002103024020012802002201280208200128020422006b411f4b0d0041004185c1001002200141046a28020021000b200241306a2000412010061a200141046a2201200128020041206a3602004200210441102101200241106a2105410021004200210602400340200241306a20006a2107024020014102490d002006420886200420073100008422044238888421062001417f6a210120044208862104200041016a22004120470d010c020b024020014101460d00410041ffc20010020b200520063703082005200420073100008437030041102101200541106a21054200210442002106200041016a22004120470d000b0b024020014110460d00024020014102490d00200220042006200141037441786a1011200241086a2903002106200229030021040b20052004370300200520063703080b20032002290310370300200341086a2002290318370300200341186a200241106a41186a290300370300200341106a200241106a41106a290300370300200241d0006a24000bba0101047f230041106b22022103200224000240024002400240024010042204450d002004418004490d012004101921020c020b2003420037030841002102200341086a21050c020b20022004410f6a4170716b220224000b2002200410051a20034200370308200341086a2105200441074b0d010b41004185c10010020b20052002410810061a20034200370300200241086a2102024020044178714108470d0041004185c10010020b20032002410810061a200341106a24000b4401037f230022022103024010042204450d00024002402004418004490d002004101921020c010b20022004410f6a4170716b220224000b2002200410051a0b200324000b4401037f230022022103024010042204450d00024002402004418004490d002004101921020c010b20022004410f6a4170716b220224000b2002200410051a0b200324000b4401037f230022022103024010042204450d00024002402004418004490d002004101921020c010b20022004410f6a4170716b220224000b2002200410051a0b200324000b4401037f230022022103024010042204450d00024002402004418004490d002004101921020c010b20022004410f6a4170716b220224000b2002200410051a0b200324000b4401037f230022022103024010042204450d00024002402004418004490d002004101921020c010b20022004410f6a4170716b220224000b2002200410051a0b200324000b4401037f230022022103024010042204450d00024002402004418004490d002004101921020c010b20022004410f6a4170716b220224000b2002200410051a0b200324000bd30201047f230041306b2202210320022400024002400240024010042204450d002004418004490d012004101921020c020b410021020c020b20022004410f6a4170716b220224000b2002200410051a0b20032002360224200320023602202003200220046a2205360228200342003703180240200441074b0d0041004185c1001002200341286a2802002105200328022421020b200341186a2002410810061a2003200241086a2202360224024020052002470d0041004185c1001002200341206a41086a2802002105200328022421020b200341176a2002410110061a2003200241016a2202360224024020052002470d0041004185c1001002200328022421020b200341166a2002410110061a2003200241016a3602242003410036021020034200370308200341206a200341086a10431a024020032802082202450d002003200236020c200210220b200341306a24000bbe0201067f0240024002400240024020002802082202200028020422036b20014f0d002003200028020022046b220520016a2206417f4c0d0241ffffffff0721070240200220046b220241feffffff034b0d0020062002410174220220022006491b2207450d020b2007102021020c030b200041046a21000340200341003a00002000200028020041016a22033602002001417f6a22010d000c040b0b41002107410021020c010b20001028000b200220076a2107200320016a20046b2104200220056a220521030340200341003a0000200341016a21032001417f6a22010d000b200220046a21042005200041046a2206280200200028020022016b22036b2102024020034101480d0020022001200310061a200028020021010b2000200236020020062004360200200041086a20073602002001450d00200110220f0b0bd00102047f017e230041106b22022103200224000240024002400240024010042204450d002004418004490d012004101921020c020b2003420037030841002102200341086a21050c020b20022004410f6a4170716b220224000b2002200410051a20034200370308200341086a2105200441074b0d010b41004185c10010020b20052002410810061a200241086a2102024020044108470d0041004185c10010020b200341076a2002410110061a2003290308210620032d0007210420001007200620044100471008200341106a24000bab0202047f047e230041206b22022103200224000240024002400240024010042204450d002004418004490d012004101921020c020b2003420037031841002102200341186a21050c020b20022004410f6a4170716b220224000b2002200410051a20034200370318200341186a2105200441074b0d010b41004185c10010020b20052002410810061a200241086a21050240200441787122044108470d0041004185c10010020b200341106a2005410810061a200241106a2105024020044110470d0041004185c10010020b200341086a2005410810061a200241186a2102024020044118470d0041004185c10010020b20032002410810061a200329030021062003290308210720032903102108200329031821092000100720092008200720061009200341206a24000bd30101047f230041206b22022103200224000240024002400240024010042204450d002004418004490d012004101921020c020b41002102200341186a21050c020b20022004410f6a4170716b220224000b2002200410051a200341186a2105200441074b0d010b41004185c10010020b20052002410810061a200241086a21050240200441787122044108470d0041004185c10010020b200341106a2005410810061a200241106a2102024020044110470d0041004185c10010020b200341086a2002410810061a20001007200341206a24000bc60301047f23004180016b220221032002240041002104024010042205450d00024002402005418004490d002005101921040c010b20022005410f6a4170716b220424000b2004200510051a0b20032004360254200320043602502003200420056a3602582003410036024820034200370340200341d0006a200341c0006a10411a200341106a41086a2204200328025836020020032003290350370310200341e0006a41086a2205200428020036020020032003290310370360200341f0006a41086a20052802002204360200200341386a20043602002003200037032020032001370328200320032903602200370330200320003703702003410036020820034200370300200328024420032802406b220441306d2105024002402004450d00200541d6aad52a4f0d01200341086a200410202204200541306c6a36020020032004360200200320043602042003280244200328024022026b22054101480d0020042002200510061a20032003280204200541306e41306c6a3602040b200341206a20031038024020032802002204450d0020032004360204200410220b024020032802402204450d0020032004360244200410220b20034180016a24000f0b20031028000bc60301067f0240024002400240024020002802082202200028020422036b41306d20014f0d002003200028020022046b41306d220520016a220641d6aad52a4f0d0241d5aad52a21030240200220046b41306d220241a9d5aa154b0d0020062002410174220320032006491b2203450d020b200341306c102021040c030b200041046a21020340200341086a2200420037030020034200370300200341286a4200370300200341206a4200370300200341186a4200370300200341106a4200370300200041003602002002200228020041306a22033602002001417f6a22010d000c040b0b41002103410021040c010b20001028000b2004200341306c6a21072004200541306c6a220521030340200341086a2202420037030020034200370300200341286a4200370300200341206a4200370300200341186a4200370300200341106a420037030020024100360200200341306a21032001417f6a22010d000b2004200641306c6a21042005200041046a2206280200200028020022036b220141506d41306c6a2102024020014101480d0020022003200110061a200028020021030b2000200236020020062004360200200041086a20073602002003450d00200310220f0b0b8a0101037f230041e0006b2202210320022400024002400240024010042204450d002004418004490d012004101921020c020b410021020c020b20022004410f6a4170716b220224000b2002200410051a0b20032002360254200320023602502003200220046a360258200341d0006a200341086a10421a20001007200341086a1029200341e0006a24000b950101047f230041106b22022103200224000240024002400240024010042204450d002004418004490d012004101921020c020b2003420037030841002102200341086a21050c020b20022004410f6a4170716b220224000b2002200410051a20034200370308200341086a2105200441074b0d010b41004185c10010020b20052002410810061a20032903081007200341106a24000bd70303047f027e017f230041f0006b2202210320022400024002400240024010042204450d002004418004490d012004101921050c020b410021050c020b20022004410f6a4170716b220524000b2005200410051a0b42002106200341286a420037030041102102200341106a41106a4200370300200342003703182003420037031002402004411f4b0d0041004185c10010020b200341d0006a2005412010061a200341306a2105410021044200210702400340200341d0006a20046a2108024020024102490d002007420886200620083100008422064238888421072002417f6a210220064208862106200441016a22044120470d010c020b024020024101460d00410041ffc20010020b200520073703082005200620083100008437030041102102200541106a21054200210642002107200441016a22044120470d000b0b024020024110460d00024020024102490d00200320062007200241037441786a1011200341086a2903002107200329030021060b20052006370300200520073703080b200341106a41186a200341306a41186a290300370300200341106a41106a200341306a41106a290300370300200320032903383703182003200329033037031020001007200341106a102c200341f0006a24000be00303047f027e017f230041f0006b2202210320022400024002400240024010042204450d002004418004490d012004101921050c020b410021050c020b20022004410f6a4170716b220524000b2005200410051a0b42002106200341286a420037030041102102200341106a41106a4200370300200342003703182003420037031002402004411f4b0d0041004185c10010020b200341d0006a2005412010061a200341306a2105410021044200210702400340200341d0006a20046a2108024020024102490d002007420886200620083100008422064238888421072002417f6a210220064208862106200441016a22044120470d010c020b024020024101460d00410041ffc20010020b200520073703082005200620083100008437030041102102200541106a21054200210642002107200441016a22044120470d000b0b024020024110460d00024020024102490d00200320062007200241037441786a1011200341086a2903002107200329030021060b20052006370300200520073703080b200341106a41186a200341306a41186a290300370300200341106a41106a200341306a41106a29030037030020032003290338370318200320032903303703100240200341106a102b0d00410041d9c20010020b200341f0006a24000beb0201037f23004180016b2202210320022400024002400240024010042204450d002004418004490d012004101921020c020b410021020c020b20022004410f6a4170716b220224000b2002200410051a0b20032002360254200320023602502003200220046a360258200342003703480240200441074b0d0041004185c1001002200328025421020b200341c8006a2002410810061a2003200241086a3602542003410036024020034200370338200341d0006a200341386a10431a200341086a41086a2202200341d0006a41086a28020036020020032003290350370308200341e0006a41086a2204200228020036020020032003290308370360200341f0006a41086a20042802002202360200200341306a2002360200200320003703182003200137032020032003290360220037032820032000370370200341186a2003290348200341386a103d024020032802382202450d002003200236023c200210220b20034180016a24000bbc0102037f017e230041306b22032400200020013602302000420037030020002002280204220428020029030037030020022802002101200428020422042802002205200428020420056b200041106a2204101520032000410810061a20034108722004412010061a2000200129030842808080809aecb4ee31200228020829030020002903002206200341281016360234024020062001290310540d00200141106a427e200642017c2006427d561b3703000b200341306a240020000baa0301057f024002402000280204200028020022046b41186d220541016a220641abd5aad5004f0d0041aad5aad500210702400240200028020820046b41186d220441d4aad52a4b0d0020062004410174220720072006491b2207450d010b200741186c102021040c020b41002107410021040c010b20001028000b20012802002106200141003602002004200541186c22086a2201200636020020012002290300370308200120032802003602102004200741186c6a2105200141186a210602400240200041046a280200220220002802002207460d00200420086a41686a21010340200241686a220428020021032004410036020020012003360200200141106a200241786a280200360200200141086a200241706a290300370300200141686a21012004210220072004470d000b200141186a2101200041046a2802002107200028020021020c010b200721020b20002001360200200041046a2006360200200041086a2005360200024020072002460d000340200741686a220728020021012007410036020002402001450d00200110220b20022007470d000b0b02402002450d00200210220b0b0bdf030b00419cc0000b4c6661696c656420746f20616c6c6f63617465207061676573006f626a6563742070617373656420746f206974657261746f725f746f206973206e6f7420696e206d756c74695f696e646578000041e8c0000b1d7772697465006572726f722072656164696e67206974657261746f7200004185c1000b05726561640000418ac1000b3363616e6e6f7420637265617465206f626a6563747320696e207461626c65206f6620616e6f7468657220636f6e7472616374000041bdc1000b2e6f626a6563742070617373656420746f206d6f64696679206973206e6f7420696e206d756c74695f696e646578000041ebc1000b3363616e6e6f74206d6f64696679206f626a6563747320696e207461626c65206f6620616e6f7468657220636f6e74726163740000419ec2000b3b757064617465722063616e6e6f74206368616e6765207072696d617279206b6579207768656e206d6f64696679696e6720616e206f626a656374000041d9c2000b2270726f746f636f6c2066656174757265206973206e6f7420616374697661746564000041fbc2000b04676574000041ffc2000b2c756e6578706563746564206572726f7220696e2066697865645f627974657320636f6e7374727563746f72000041000b04b02100000000000000000000000003917c562680b415b93db73416ff29230dfbe7ab1ba4d208b46029d01333cd3a03000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b44010000000000ea30556ab602000000000000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG RAM_OP 0 eosio abi update setabi eosio 180538 44 DMLOG RAM_OP 0 eosio:eosio:abihash table add create_table eosio 180650 112 @@ -46,94 +46,94 @@ DMLOG TBL_OP INS 0 eosio eosio abihash eosio DMLOG RAM_OP 0 eosio:eosio:abihash:eosio table_row add primary_index_add eosio 180802 152 DMLOG DB_OP INS 0 eosio eosio eosio abihash eosio 0000000000ea3055d7abd75d188060de8a01ab2672d1cc2cd768fddc56203181b43685cc11f5ce46 DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":41298,"consumed":7136},"cpu_usage":{"last_ordinal":1262304002,"value_ex":24307,"consumed":4101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 78216184577675cf681592f18c754116fdf63576c1fa05b7566dd6ae6fe2ed8003000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910100d00700008101000000000000000008040000000000000001010000010000000000ea3055e7de58a9939c6e694d3235202685f51b7fab8e82b1f9f96a637dafd9be0998a204000000000000000400000000000000010000000000ea3055040000000000000001010000000000ea30550000000000ea305500000000b863b2c2010000000000ea305500000000a8ed32328a110000000000ea305580110e656f73696f3a3a6162692f312e310019086162695f686173680002056f776e6572046e616d6504686173680b636865636b73756d32353608616374697661746500010e666561747572655f6469676573740b636865636b73756d32353609617574686f726974790004097468726573686f6c640675696e743332046b6579730c6b65795f7765696768745b5d086163636f756e7473197065726d697373696f6e5f6c6576656c5f7765696768745b5d0577616974730d776169745f7765696768745b5d15626c6f636b636861696e5f706172616d65746572730011136d61785f626c6f636b5f6e65745f75736167650675696e7436341a7461726765745f626c6f636b5f6e65745f75736167655f7063740675696e743332196d61785f7472616e73616374696f6e5f6e65745f75736167650675696e7433321e626173655f7065725f7472616e73616374696f6e5f6e65745f75736167650675696e743332106e65745f75736167655f6c65657761790675696e74333223636f6e746578745f667265655f646973636f756e745f6e65745f75736167655f6e756d0675696e74333223636f6e746578745f667265655f646973636f756e745f6e65745f75736167655f64656e0675696e743332136d61785f626c6f636b5f6370755f75736167650675696e7433321a7461726765745f626c6f636b5f6370755f75736167655f7063740675696e743332196d61785f7472616e73616374696f6e5f6370755f75736167650675696e743332196d696e5f7472616e73616374696f6e5f6370755f75736167650675696e743332186d61785f7472616e73616374696f6e5f6c69666574696d650675696e7433321e64656665727265645f7472785f65787069726174696f6e5f77696e646f770675696e743332156d61785f7472616e73616374696f6e5f64656c61790675696e743332166d61785f696e6c696e655f616374696f6e5f73697a650675696e743332176d61785f696e6c696e655f616374696f6e5f64657074680675696e743136136d61785f617574686f726974795f64657074680675696e7431360b63616e63656c64656c617900020e63616e63656c696e675f61757468107065726d697373696f6e5f6c6576656c067472785f69640b636865636b73756d3235360a64656c657465617574680002076163636f756e74046e616d650a7065726d697373696f6e046e616d650a6b65795f7765696768740002036b65790a7075626c69635f6b6579067765696768740675696e743136086c696e6b617574680004076163636f756e74046e616d6504636f6465046e616d650474797065046e616d650b726571756972656d656e74046e616d650a6e65776163636f756e7400040763726561746f72046e616d65046e616d65046e616d65056f776e657209617574686f726974790661637469766509617574686f72697479076f6e6572726f7200020973656e6465725f69640775696e743132380873656e745f747278056279746573107065726d697373696f6e5f6c6576656c0002056163746f72046e616d650a7065726d697373696f6e046e616d65177065726d697373696f6e5f6c6576656c5f77656967687400020a7065726d697373696f6e107065726d697373696f6e5f6c6576656c067765696768740675696e7431360c70726f64756365725f6b657900020d70726f64756365725f6e616d65046e616d6511626c6f636b5f7369676e696e675f6b65790a7075626c69635f6b65790c72657161637469766174656400010e666561747572655f6469676573740b636865636b73756d323536077265716175746800010466726f6d046e616d65067365746162690002076163636f756e74046e616d65036162690562797465730a736574616c696d6974730004076163636f756e74046e616d650972616d5f627974657305696e7436340a6e65745f77656967687405696e7436340a6370755f77656967687405696e74363407736574636f64650004076163636f756e74046e616d6506766d747970650575696e743809766d76657273696f6e0575696e743804636f64650562797465730a736574676c696d69747300030372616d0675696e743634036e65740675696e743634036370750675696e74363409736574706172616d73000106706172616d7315626c6f636b636861696e5f706172616d657465727307736574707269760002076163636f756e74046e616d650769735f707269760575696e74380873657470726f64730001087363686564756c650e70726f64756365725f6b65795b5d0a756e6c696e6b617574680003076163636f756e74046e616d6504636f6465046e616d650474797065046e616d650a757064617465617574680004076163636f756e74046e616d650a7065726d697373696f6e046e616d6506706172656e74046e616d65046175746809617574686f726974790b776169745f776569676874000208776169745f7365630675696e743332067765696768740675696e743136110000002a9bed32320861637469766174650000bc892a4585a6410b63616e63656c64656c6179000040cbdaa8aca24a0a64656c65746561757468000000002d6b03a78b086c696e6b617574680000409e9a2264b89a0a6e65776163636f756e7400000000e0d27bd5a4076f6e6572726f7200905436db6564acba0c72657161637469766174656400000000a0656dacba07726571617574680000000000b863b2c206736574616269000000ce4eba68b2c20a736574616c696d6974730000000040258ab2c207736574636f6465000000ce4ebac8b2c20a736574676c696d697473000000c0d25c53b3c209736574706172616d730000000060bb5bb3c207736574707269760000000038d15bb3c20873657470726f6473000040cbdac0e9e2d40a756e6c696e6b61757468000040cbdaa86c52d50a757064617465617574680001000000a061d3dc31036936340000086162695f6861736800000000000000000000000000000078216184577675cf681592f18c754116fdf63576c1fa05b7566dd6ae6fe2ed8003000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d91010000000000ea3055340100000000000000000000000000 +DMLOG APPLIED_TRANSACTION 3 78216184577675cf681592f18c754116fdf63576c1fa05b7566dd6ae6fe2ed8003000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440100d00700008101000000000000000008040000000000000001010000010000000000ea3055e7de58a9939c6e694d3235202685f51b7fab8e82b1f9f96a637dafd9be0998a204000000000000000400000000000000010000000000ea3055040000000000000001010000000000ea30550000000000ea305500000000b863b2c2010000000000ea305500000000a8ed32328a110000000000ea305580110e656f73696f3a3a6162692f312e310019086162695f686173680002056f776e6572046e616d6504686173680b636865636b73756d32353608616374697661746500010e666561747572655f6469676573740b636865636b73756d32353609617574686f726974790004097468726573686f6c640675696e743332046b6579730c6b65795f7765696768745b5d086163636f756e7473197065726d697373696f6e5f6c6576656c5f7765696768745b5d0577616974730d776169745f7765696768745b5d15626c6f636b636861696e5f706172616d65746572730011136d61785f626c6f636b5f6e65745f75736167650675696e7436341a7461726765745f626c6f636b5f6e65745f75736167655f7063740675696e743332196d61785f7472616e73616374696f6e5f6e65745f75736167650675696e7433321e626173655f7065725f7472616e73616374696f6e5f6e65745f75736167650675696e743332106e65745f75736167655f6c65657761790675696e74333223636f6e746578745f667265655f646973636f756e745f6e65745f75736167655f6e756d0675696e74333223636f6e746578745f667265655f646973636f756e745f6e65745f75736167655f64656e0675696e743332136d61785f626c6f636b5f6370755f75736167650675696e7433321a7461726765745f626c6f636b5f6370755f75736167655f7063740675696e743332196d61785f7472616e73616374696f6e5f6370755f75736167650675696e743332196d696e5f7472616e73616374696f6e5f6370755f75736167650675696e743332186d61785f7472616e73616374696f6e5f6c69666574696d650675696e7433321e64656665727265645f7472785f65787069726174696f6e5f77696e646f770675696e743332156d61785f7472616e73616374696f6e5f64656c61790675696e743332166d61785f696e6c696e655f616374696f6e5f73697a650675696e743332176d61785f696e6c696e655f616374696f6e5f64657074680675696e743136136d61785f617574686f726974795f64657074680675696e7431360b63616e63656c64656c617900020e63616e63656c696e675f61757468107065726d697373696f6e5f6c6576656c067472785f69640b636865636b73756d3235360a64656c657465617574680002076163636f756e74046e616d650a7065726d697373696f6e046e616d650a6b65795f7765696768740002036b65790a7075626c69635f6b6579067765696768740675696e743136086c696e6b617574680004076163636f756e74046e616d6504636f6465046e616d650474797065046e616d650b726571756972656d656e74046e616d650a6e65776163636f756e7400040763726561746f72046e616d65046e616d65046e616d65056f776e657209617574686f726974790661637469766509617574686f72697479076f6e6572726f7200020973656e6465725f69640775696e743132380873656e745f747278056279746573107065726d697373696f6e5f6c6576656c0002056163746f72046e616d650a7065726d697373696f6e046e616d65177065726d697373696f6e5f6c6576656c5f77656967687400020a7065726d697373696f6e107065726d697373696f6e5f6c6576656c067765696768740675696e7431360c70726f64756365725f6b657900020d70726f64756365725f6e616d65046e616d6511626c6f636b5f7369676e696e675f6b65790a7075626c69635f6b65790c72657161637469766174656400010e666561747572655f6469676573740b636865636b73756d323536077265716175746800010466726f6d046e616d65067365746162690002076163636f756e74046e616d65036162690562797465730a736574616c696d6974730004076163636f756e74046e616d650972616d5f627974657305696e7436340a6e65745f77656967687405696e7436340a6370755f77656967687405696e74363407736574636f64650004076163636f756e74046e616d6506766d747970650575696e743809766d76657273696f6e0575696e743804636f64650562797465730a736574676c696d69747300030372616d0675696e743634036e65740675696e743634036370750675696e74363409736574706172616d73000106706172616d7315626c6f636b636861696e5f706172616d657465727307736574707269760002076163636f756e74046e616d650769735f707269760575696e74380873657470726f64730001087363686564756c650e70726f64756365725f6b65795b5d0a756e6c696e6b617574680003076163636f756e74046e616d6504636f6465046e616d650474797065046e616d650a757064617465617574680004076163636f756e74046e616d650a7065726d697373696f6e046e616d6506706172656e74046e616d65046175746809617574686f726974790b776169745f776569676874000208776169745f7365630675696e743332067765696768740675696e743136110000002a9bed32320861637469766174650000bc892a4585a6410b63616e63656c64656c6179000040cbdaa8aca24a0a64656c65746561757468000000002d6b03a78b086c696e6b617574680000409e9a2264b89a0a6e65776163636f756e7400000000e0d27bd5a4076f6e6572726f7200905436db6564acba0c72657161637469766174656400000000a0656dacba07726571617574680000000000b863b2c206736574616269000000ce4eba68b2c20a736574616c696d6974730000000040258ab2c207736574636f6465000000ce4ebac8b2c20a736574676c696d697473000000c0d25c53b3c209736574706172616d730000000060bb5bb3c207736574707269760000000038d15bb3c20873657470726f6473000040cbdac0e9e2d40a756e6c696e6b61757468000040cbdaa86c52d50a757064617465617574680001000000a061d3dc31036936340000086162695f6861736800000000000000000000000000000078216184577675cf681592f18c754116fdf63576c1fa05b7566dd6ae6fe2ed8003000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b44010000000000ea3055340100000000000000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 1a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b7241 {"feature_digest":"1a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b7241","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"f3c3d91c4603cde2397268bfed4e662465293aab10cd9416db0d442b8cec2949","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"ONLY_LINK_TO_EXISTING_PERMISSION"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":42039,"consumed":7264},"cpu_usage":{"last_ordinal":1262304002,"value_ex":35882,"consumed":6101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 aa30bc93a59737ce708fd4d691b61d7858bfb309c4cf883e77a6a161b5a4abe503000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910100d007000010000000000000000080000000000000000001010000010000000000ea3055218268a92acd1b24eeaeff3b51b569de14ee151eea2132d748be984aa9535d1405000000000000000500000000000000010000000000ea3055050000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232201a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b724100000000000000000000aa30bc93a59737ce708fd4d691b61d7858bfb309c4cf883e77a6a161b5a4abe503000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910000000000000000 +DMLOG APPLIED_TRANSACTION 3 aa30bc93a59737ce708fd4d691b61d7858bfb309c4cf883e77a6a161b5a4abe503000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440100d007000010000000000000000080000000000000000001010000010000000000ea3055218268a92acd1b24eeaeff3b51b569de14ee151eea2132d748be984aa9535d1405000000000000000500000000000000010000000000ea3055050000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232201a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b724100000000000000000000aa30bc93a59737ce708fd4d691b61d7858bfb309c4cf883e77a6a161b5a4abe503000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea99 {"feature_digest":"ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea99","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"9908b3f8413c8474ab2a6be149d3f4f6d0421d37886033f27d4759c47a26d944","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"REPLACE_DEFERRED"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":42780,"consumed":7392},"cpu_usage":{"last_ordinal":1262304002,"value_ex":47457,"consumed":8101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 3f12eecaafb41ec5142c6c6d69df767fb8f5183e1e5468aa418bef38a2bdf2bb03000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910100d007000010000000000000000080000000000000000001010000010000000000ea305513ab6d113ba5b180d6f68e1b67bdea99847550d673a1785e40dfe4faee8ec7c706000000000000000600000000000000010000000000ea3055060000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea99000000000000000000003f12eecaafb41ec5142c6c6d69df767fb8f5183e1e5468aa418bef38a2bdf2bb03000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910000000000000000 +DMLOG APPLIED_TRANSACTION 3 3f12eecaafb41ec5142c6c6d69df767fb8f5183e1e5468aa418bef38a2bdf2bb03000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440100d007000010000000000000000080000000000000000001010000010000000000ea305513ab6d113ba5b180d6f68e1b67bdea99847550d673a1785e40dfe4faee8ec7c706000000000000000600000000000000010000000000ea3055060000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea99000000000000000000003f12eecaafb41ec5142c6c6d69df767fb8f5183e1e5468aa418bef38a2bdf2bb03000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 4a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0f {"feature_digest":"4a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0f","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"45967387ee92da70171efd9fefd1ca8061b5efe6f124d269cd2468b47f1575a0","dependencies":["ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea99"],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"NO_DUPLICATE_DEFERRED_ID"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":43521,"consumed":7520},"cpu_usage":{"last_ordinal":1262304002,"value_ex":59032,"consumed":10101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 39ec55367e4e4d0d6063a5e5aa2aa15d4a1aa1fbe0abe42c9081713ee04e55b103000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910100d007000010000000000000000080000000000000000001010000010000000000ea30552267bc3ee69f217c4f0bdbff84c23074f1780839b8adfb17537db55da4a0dc7607000000000000000700000000000000010000000000ea3055070000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232204a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0f0000000000000000000039ec55367e4e4d0d6063a5e5aa2aa15d4a1aa1fbe0abe42c9081713ee04e55b103000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910000000000000000 +DMLOG APPLIED_TRANSACTION 3 39ec55367e4e4d0d6063a5e5aa2aa15d4a1aa1fbe0abe42c9081713ee04e55b103000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440100d007000010000000000000000080000000000000000001010000010000000000ea30552267bc3ee69f217c4f0bdbff84c23074f1780839b8adfb17537db55da4a0dc7607000000000000000700000000000000010000000000ea3055070000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232204a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0f0000000000000000000039ec55367e4e4d0d6063a5e5aa2aa15d4a1aa1fbe0abe42c9081713ee04e55b103000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 e0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff526 {"feature_digest":"e0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff526","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"a98241c83511dc86c857221b9372b4aa7cea3aaebc567a48604e1d3db3557050","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"FIX_LINKAUTH_RESTRICTION"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":44262,"consumed":7648},"cpu_usage":{"last_ordinal":1262304002,"value_ex":70607,"consumed":12101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 72c5e78f690d5d20ec8c8e12ace2a3b34929099b93f621a8671ae43df821bc5b03000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910100d007000010000000000000000080000000000000000001010000010000000000ea30550f86c0418ffb919c58d37997594e446d2d98fd38b1ff3849da2c5da410aa331a08000000000000000800000000000000010000000000ea3055080000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220e0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff5260000000000000000000072c5e78f690d5d20ec8c8e12ace2a3b34929099b93f621a8671ae43df821bc5b03000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910000000000000000 +DMLOG APPLIED_TRANSACTION 3 72c5e78f690d5d20ec8c8e12ace2a3b34929099b93f621a8671ae43df821bc5b03000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440100d007000010000000000000000080000000000000000001010000010000000000ea30550f86c0418ffb919c58d37997594e446d2d98fd38b1ff3849da2c5da410aa331a08000000000000000800000000000000010000000000ea3055080000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220e0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff5260000000000000000000072c5e78f690d5d20ec8c8e12ace2a3b34929099b93f621a8671ae43df821bc5b03000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 68dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a297428 {"feature_digest":"68dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a297428","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"2853617cec3eabd41881eb48882e6fc5e81a0db917d375057864b3befbe29acd","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"DISALLOW_EMPTY_PRODUCER_SCHEDULE"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":45003,"consumed":7776},"cpu_usage":{"last_ordinal":1262304002,"value_ex":82182,"consumed":14101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 e358ede0d30a5ac5fa03a484a5142b0a38f658e0fb57644adb5b60c94206f9e003000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910100d007000010000000000000000080000000000000000001010000010000000000ea3055659dd999c0cb81c2eea85d3eda39898997e4a9bd57bcebcac06cc25db35e000b09000000000000000900000000000000010000000000ea3055090000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed32322068dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a29742800000000000000000000e358ede0d30a5ac5fa03a484a5142b0a38f658e0fb57644adb5b60c94206f9e003000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910000000000000000 +DMLOG APPLIED_TRANSACTION 3 e358ede0d30a5ac5fa03a484a5142b0a38f658e0fb57644adb5b60c94206f9e003000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440100d007000010000000000000000080000000000000000001010000010000000000ea3055659dd999c0cb81c2eea85d3eda39898997e4a9bd57bcebcac06cc25db35e000b09000000000000000900000000000000010000000000ea3055090000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed32322068dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a29742800000000000000000000e358ede0d30a5ac5fa03a484a5142b0a38f658e0fb57644adb5b60c94206f9e003000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c43 {"feature_digest":"ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c43","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"e71b6712188391994c78d8c722c1d42c477cf091e5601b5cf1befd05721a57f3","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"RESTRICT_ACTION_TO_SELF"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":45744,"consumed":7904},"cpu_usage":{"last_ordinal":1262304002,"value_ex":93757,"consumed":16101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 60b8a605178774eed85eb65b3ae743e5f3dc9b11d4672e1d00be33a0d21c8dae03000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910100d007000010000000000000000080000000000000000001010000010000000000ea3055d209fd21b66b7e1f62b25302fd208120700fb20e0a9a0151d3909e1ca7a98f460a000000000000000a00000000000000010000000000ea30550a0000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c430000000000000000000060b8a605178774eed85eb65b3ae743e5f3dc9b11d4672e1d00be33a0d21c8dae03000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910000000000000000 +DMLOG APPLIED_TRANSACTION 3 60b8a605178774eed85eb65b3ae743e5f3dc9b11d4672e1d00be33a0d21c8dae03000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440100d007000010000000000000000080000000000000000001010000010000000000ea3055d209fd21b66b7e1f62b25302fd208120700fb20e0a9a0151d3909e1ca7a98f460a000000000000000a00000000000000010000000000ea30550a0000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c430000000000000000000060b8a605178774eed85eb65b3ae743e5f3dc9b11d4672e1d00be33a0d21c8dae03000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 8ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a405 {"feature_digest":"8ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a405","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"2f1f13e291c79da5a2bbad259ed7c1f2d34f697ea460b14b565ac33b063b73e2","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"ONLY_BILL_FIRST_AUTHORIZER"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":46485,"consumed":8032},"cpu_usage":{"last_ordinal":1262304002,"value_ex":105332,"consumed":18101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 689db7ff0751fd6025dbc997d9a7ca1fe4e525ee48e55e5fb2aee8403077dd3e03000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910100d007000010000000000000000080000000000000000001010000010000000000ea3055fd71f42952743b790fcaa82dabd6a843676b9bd5b91c891fc050f9c41374a35e0b000000000000000b00000000000000010000000000ea30550b0000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232208ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a40500000000000000000000689db7ff0751fd6025dbc997d9a7ca1fe4e525ee48e55e5fb2aee8403077dd3e03000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910000000000000000 +DMLOG APPLIED_TRANSACTION 3 689db7ff0751fd6025dbc997d9a7ca1fe4e525ee48e55e5fb2aee8403077dd3e03000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440100d007000010000000000000000080000000000000000001010000010000000000ea3055fd71f42952743b790fcaa82dabd6a843676b9bd5b91c891fc050f9c41374a35e0b000000000000000b00000000000000010000000000ea30550b0000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232208ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a40500000000000000000000689db7ff0751fd6025dbc997d9a7ca1fe4e525ee48e55e5fb2aee8403077dd3e03000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 2652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25 {"feature_digest":"2652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"898082c59f921d0042e581f00a59d5ceb8be6f1d9c7a45b6f07c0e26eaee0222","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"FORWARD_SETCODE"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":47226,"consumed":8160},"cpu_usage":{"last_ordinal":1262304002,"value_ex":116907,"consumed":20101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 48ed94d5a6fa7dd478278b29bbff0a72bd9d9a5431423ed3f0b1ce393643108303000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910100d007000010000000000000000080000000000000000001010000010000000000ea305512250767854476ab3904c7f604b0322bfa91821d01ddb20ecfaaff1beef8e04b0c000000000000000c00000000000000010000000000ea30550c0000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232202652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed250000000000000000000048ed94d5a6fa7dd478278b29bbff0a72bd9d9a5431423ed3f0b1ce393643108303000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910000000000000000 +DMLOG APPLIED_TRANSACTION 3 48ed94d5a6fa7dd478278b29bbff0a72bd9d9a5431423ed3f0b1ce393643108303000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440100d007000010000000000000000080000000000000000001010000010000000000ea305512250767854476ab3904c7f604b0322bfa91821d01ddb20ecfaaff1beef8e04b0c000000000000000c00000000000000010000000000ea30550c0000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232202652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed250000000000000000000048ed94d5a6fa7dd478278b29bbff0a72bd9d9a5431423ed3f0b1ce393643108303000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d {"feature_digest":"f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"1eab748b95a2e6f4d7cb42065bdee5566af8efddf01a55a0a8d831b823f8828a","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"GET_SENDER"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":47967,"consumed":8288},"cpu_usage":{"last_ordinal":1262304002,"value_ex":128482,"consumed":22101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 aa192243a78a9d8954a3af3f044207536068d3ad3f7ffb3b7de53b959de190b003000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910100d007000010000000000000000080000000000000000001010000010000000000ea3055063f8bf038af0888c33fcfdd66c2f91fd6b060df73aaa32a1e905b143ceb9ac00d000000000000000d00000000000000010000000000ea30550d0000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d00000000000000000000aa192243a78a9d8954a3af3f044207536068d3ad3f7ffb3b7de53b959de190b003000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910000000000000000 +DMLOG APPLIED_TRANSACTION 3 aa192243a78a9d8954a3af3f044207536068d3ad3f7ffb3b7de53b959de190b003000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440100d007000010000000000000000080000000000000000001010000010000000000ea3055063f8bf038af0888c33fcfdd66c2f91fd6b060df73aaa32a1e905b143ceb9ac00d000000000000000d00000000000000010000000000ea30550d0000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d00000000000000000000aa192243a78a9d8954a3af3f044207536068d3ad3f7ffb3b7de53b959de190b003000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d67 {"feature_digest":"4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d67","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"1812fdb5096fd854a4958eb9d53b43219d114de0e858ce00255bd46569ad2c68","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"RAM_RESTRICTIONS"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":48708,"consumed":8416},"cpu_usage":{"last_ordinal":1262304002,"value_ex":140057,"consumed":24101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 a9e581a81302c707c14f5985458d2ef53faf24afacb03115f5cbc17271d7504803000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910100d007000010000000000000000080000000000000000001010000010000000000ea3055f279231a0740adb280f58749e984c932e17897073e9aedc1c33a102df52498430e000000000000000e00000000000000010000000000ea30550e0000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232204e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d6700000000000000000000a9e581a81302c707c14f5985458d2ef53faf24afacb03115f5cbc17271d7504803000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910000000000000000 +DMLOG APPLIED_TRANSACTION 3 a9e581a81302c707c14f5985458d2ef53faf24afacb03115f5cbc17271d7504803000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440100d007000010000000000000000080000000000000000001010000010000000000ea3055f279231a0740adb280f58749e984c932e17897073e9aedc1c33a102df52498430e000000000000000e00000000000000010000000000ea30550e0000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232204e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d6700000000000000000000a9e581a81302c707c14f5985458d2ef53faf24afacb03115f5cbc17271d7504803000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 4fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c2 {"feature_digest":"4fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c2","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"927fdf78c51e77a899f2db938249fb1f8bb38f4e43d9c1f75b190492080cbc34","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"WEBAUTHN_KEY"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":49449,"consumed":8544},"cpu_usage":{"last_ordinal":1262304002,"value_ex":151632,"consumed":26101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 4185b6265a360d2bf774af7d82bd837333cfb6b976390dac78c284207b6bbce103000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910100d007000010000000000000000080000000000000000001010000010000000000ea305578e423734b3bacaadd9c1864e7a7c612255a9c0d9fcdeba49708ee6b147e13170f000000000000000f00000000000000010000000000ea30550f0000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232204fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c2000000000000000000004185b6265a360d2bf774af7d82bd837333cfb6b976390dac78c284207b6bbce103000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910000000000000000 +DMLOG APPLIED_TRANSACTION 3 4185b6265a360d2bf774af7d82bd837333cfb6b976390dac78c284207b6bbce103000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440100d007000010000000000000000080000000000000000001010000010000000000ea305578e423734b3bacaadd9c1864e7a7c612255a9c0d9fcdeba49708ee6b147e13170f000000000000000f00000000000000010000000000ea30550f0000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232204fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c2000000000000000000004185b6265a360d2bf774af7d82bd837333cfb6b976390dac78c284207b6bbce103000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b4476707 {"feature_digest":"299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b4476707","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"ab76031cad7a457f4fd5f5fca97a3f03b8a635278e0416f77dcc91eb99a48e10","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"WTMSIG_BLOCK_SIGNATURES"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":50190,"consumed":8672},"cpu_usage":{"last_ordinal":1262304002,"value_ex":163207,"consumed":28101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 f6025d888ddcfb8fdfeee18204122f8b7a71908a96ac4e52bf9542ff398b0d4403000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910100d007000010000000000000000080000000000000000001010000010000000000ea3055368a5df8e81472fb54f3424401fba4956a6e0737806b4f642b2d7014cf66fc2c10000000000000001000000000000000010000000000ea3055100000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b447670700000000000000000000f6025d888ddcfb8fdfeee18204122f8b7a71908a96ac4e52bf9542ff398b0d4403000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910000000000000000 +DMLOG APPLIED_TRANSACTION 3 f6025d888ddcfb8fdfeee18204122f8b7a71908a96ac4e52bf9542ff398b0d4403000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440100d007000010000000000000000080000000000000000001010000010000000000ea3055368a5df8e81472fb54f3424401fba4956a6e0737806b4f642b2d7014cf66fc2c10000000000000001000000000000000010000000000ea3055100000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b447670700000000000000000000f6025d888ddcfb8fdfeee18204122f8b7a71908a96ac4e52bf9542ff398b0d4403000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead45071 {"feature_digest":"c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead45071","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"69b064c5178e2738e144ed6caa9349a3995370d78db29e494b3126ebd9111966","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"ACTION_RETURN_VALUE"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":50931,"consumed":8800},"cpu_usage":{"last_ordinal":1262304002,"value_ex":174782,"consumed":30101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 116b232e8995b25d7bab8c5134bc993bcd84e72bc35d0b27fe723d7d25e98ac703000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910100d007000010000000000000000080000000000000000001010000010000000000ea30552acd5ab1218225e0cc0a013d8e86b58cfc4d998058708fb1eb0116c1124f7c7f11000000000000001100000000000000010000000000ea3055110000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead4507100000000000000000000116b232e8995b25d7bab8c5134bc993bcd84e72bc35d0b27fe723d7d25e98ac703000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910000000000000000 +DMLOG APPLIED_TRANSACTION 3 116b232e8995b25d7bab8c5134bc993bcd84e72bc35d0b27fe723d7d25e98ac703000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440100d007000010000000000000000080000000000000000001010000010000000000ea30552acd5ab1218225e0cc0a013d8e86b58cfc4d998058708fb1eb0116c1124f7c7f11000000000000001100000000000000010000000000ea3055110000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead4507100000000000000000000116b232e8995b25d7bab8c5134bc993bcd84e72bc35d0b27fe723d7d25e98ac703000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 5443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b4 {"feature_digest":"5443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b4","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"70787548dcea1a2c52c913a37f74ce99e6caae79110d7ca7b859936a0075b314","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"BLOCKCHAIN_PARAMETERS"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":51672,"consumed":8928},"cpu_usage":{"last_ordinal":1262304002,"value_ex":186357,"consumed":32101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 11a09bc0cc023daf656af6dadf37577a9d4c0cea8020c1d007a2c3d6dc1e52c103000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910100d007000010000000000000000080000000000000000001010000010000000000ea3055db17f5e8a451e3814885ec6d61c420ac422f1e0de77043c9024e592b64f8bd1412000000000000001200000000000000010000000000ea3055120000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232205443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b40000000000000000000011a09bc0cc023daf656af6dadf37577a9d4c0cea8020c1d007a2c3d6dc1e52c103000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910000000000000000 +DMLOG APPLIED_TRANSACTION 3 11a09bc0cc023daf656af6dadf37577a9d4c0cea8020c1d007a2c3d6dc1e52c103000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440100d007000010000000000000000080000000000000000001010000010000000000ea3055db17f5e8a451e3814885ec6d61c420ac422f1e0de77043c9024e592b64f8bd1412000000000000001200000000000000010000000000ea3055120000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232205443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b40000000000000000000011a09bc0cc023daf656af6dadf37577a9d4c0cea8020c1d007a2c3d6dc1e52c103000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e99 {"feature_digest":"bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e99","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"d2596697fed14a0840013647b99045022ae6a885089f35a7e78da7a43ad76ed4","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"GET_CODE_HASH"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":52413,"consumed":9056},"cpu_usage":{"last_ordinal":1262304002,"value_ex":197932,"consumed":34101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 76bcbbd871a26403befd2ebf5491d6b84ded9f29cb95bfd54ca6ec46b1dfad5903000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910100d007000010000000000000000080000000000000000001010000010000000000ea3055693240e7063adb7478594592f8a6e6cb76e33cabc605272575b687e3a0fa5f5e13000000000000001300000000000000010000000000ea3055130000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e990000000000000000000076bcbbd871a26403befd2ebf5491d6b84ded9f29cb95bfd54ca6ec46b1dfad5903000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910000000000000000 +DMLOG APPLIED_TRANSACTION 3 76bcbbd871a26403befd2ebf5491d6b84ded9f29cb95bfd54ca6ec46b1dfad5903000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440100d007000010000000000000000080000000000000000001010000010000000000ea3055693240e7063adb7478594592f8a6e6cb76e33cabc605272575b687e3a0fa5f5e13000000000000001300000000000000010000000000ea3055130000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e990000000000000000000076bcbbd871a26403befd2ebf5491d6b84ded9f29cb95bfd54ca6ec46b1dfad5903000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb40 {"feature_digest":"d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb40","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"8139e99247b87f18ef7eae99f07f00ea3adf39ed53f4d2da3f44e6aa0bfd7c62","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"CONFIGURABLE_WASM_LIMITS2"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":53154,"consumed":9184},"cpu_usage":{"last_ordinal":1262304002,"value_ex":209507,"consumed":36101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 1948411767455fe23b05b44fe5fb737422ce3831a41f2c68064990fd6f52fdaf03000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910100d007000010000000000000000080000000000000000001010000010000000000ea3055a40aa97866a6e0814065142f7d1038aaccb2e8a73661f6554c415c331ab8ec8b14000000000000001400000000000000010000000000ea3055140000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb40000000000000000000001948411767455fe23b05b44fe5fb737422ce3831a41f2c68064990fd6f52fdaf03000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910000000000000000 +DMLOG APPLIED_TRANSACTION 3 1948411767455fe23b05b44fe5fb737422ce3831a41f2c68064990fd6f52fdaf03000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440100d007000010000000000000000080000000000000000001010000010000000000ea3055a40aa97866a6e0814065142f7d1038aaccb2e8a73661f6554c415c331ab8ec8b14000000000000001400000000000000010000000000ea3055140000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb40000000000000000000001948411767455fe23b05b44fe5fb737422ce3831a41f2c68064990fd6f52fdaf03000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 6bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc {"feature_digest":"6bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"68d6405cb8df3de95bd834ebb408196578500a9f818ff62ccc68f60b932f7d82","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"CRYPTO_PRIMITIVES"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":53895,"consumed":9312},"cpu_usage":{"last_ordinal":1262304002,"value_ex":221082,"consumed":38101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 3cea935e0deaa090b14d4ee01f3fee31a1c426779f1c32840aefaa99cb83ec5f03000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910100d007000010000000000000000080000000000000000001010000010000000000ea30555705a61c2ae1877963ee8e857abb78d2975071d25ce32f1235b4d4803967a9fa15000000000000001500000000000000010000000000ea3055150000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232206bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc000000000000000000003cea935e0deaa090b14d4ee01f3fee31a1c426779f1c32840aefaa99cb83ec5f03000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910000000000000000 +DMLOG APPLIED_TRANSACTION 3 3cea935e0deaa090b14d4ee01f3fee31a1c426779f1c32840aefaa99cb83ec5f03000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440100d007000010000000000000000080000000000000000001010000010000000000ea30555705a61c2ae1877963ee8e857abb78d2975071d25ce32f1235b4d4803967a9fa15000000000000001500000000000000010000000000ea3055150000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232206bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc000000000000000000003cea935e0deaa090b14d4ee01f3fee31a1c426779f1c32840aefaa99cb83ec5f03000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 35c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b {"feature_digest":"35c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"e5d7992006e628a38c5e6c28dd55ff5e57ea682079bf41fef9b3cced0f46b491","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"GET_BLOCK_NUM"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":54636,"consumed":9440},"cpu_usage":{"last_ordinal":1262304002,"value_ex":232657,"consumed":40101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 04ba316cf9ddd86690833edc0f4548f8c07f0d66c09dca029b0a1fb96f16c62803000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910100d007000010000000000000000080000000000000000001010000010000000000ea3055302a2f1713925c939a997367c967b457bfc2c580304f9686b1de22fc5946e40616000000000000001600000000000000010000000000ea3055160000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed32322035c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b0000000000000000000004ba316cf9ddd86690833edc0f4548f8c07f0d66c09dca029b0a1fb96f16c62803000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910000000000000000 +DMLOG APPLIED_TRANSACTION 3 04ba316cf9ddd86690833edc0f4548f8c07f0d66c09dca029b0a1fb96f16c62803000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440100d007000010000000000000000080000000000000000001010000010000000000ea3055302a2f1713925c939a997367c967b457bfc2c580304f9686b1de22fc5946e40616000000000000001600000000000000010000000000ea3055160000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed32322035c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b0000000000000000000004ba316cf9ddd86690833edc0f4548f8c07f0d66c09dca029b0a1fb96f16c62803000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440000000000000000 DMLOG CREATION_OP ROOT 0 -DMLOG FEATURE_OP PRE_ACTIVATE 0 98c4175db53ed27e7911a1b5adf0e7db0fc96c2cae172cf594dfa9a742ca9e88 {"feature_digest":"98c4175db53ed27e7911a1b5adf0e7db0fc96c2cae172cf594dfa9a742ca9e88","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"01969c44de35999b924095ae7f50081a7f274409fdbccb9fc54fa7836c76089c","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"BLS_PRIMITIVES"}]} +DMLOG FEATURE_OP PRE_ACTIVATE 0 63320dd4a58212e4d32d1f58926b73ca33a247326c2a5e9fd39268d2384e011a {"feature_digest":"63320dd4a58212e4d32d1f58926b73ca33a247326c2a5e9fd39268d2384e011a","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"c0cce5bcd8ea19a28d9e12eafda65ebe6d0e0177e280d4f20c7ad66dcd9e011b","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"BLS_PRIMITIVES2"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":55377,"consumed":9568},"cpu_usage":{"last_ordinal":1262304002,"value_ex":244232,"consumed":42101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 793b276fb55f2f81cbdcfcaf882555ea5dde340f80c16e5dc652ffad52eea87c03000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910100d007000010000000000000000080000000000000000001010000010000000000ea30553a97dc6254ea785e8c6ee5994044fae975bfc8ef1916a24b476a984724cc5cf017000000000000001700000000000000010000000000ea3055170000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed32322098c4175db53ed27e7911a1b5adf0e7db0fc96c2cae172cf594dfa9a742ca9e8800000000000000000000793b276fb55f2f81cbdcfcaf882555ea5dde340f80c16e5dc652ffad52eea87c03000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910000000000000000 +DMLOG APPLIED_TRANSACTION 3 450cd1132e85279e093be4ae967a313b793f7fe0bf579e0f0852e003a04ad39d03000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440100d007000010000000000000000080000000000000000001010000010000000000ea3055ddd516213adb142966c5365d88fe333b8e244cb90fe77627ff51a2901becc46d17000000000000001700000000000000010000000000ea3055170000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed32322063320dd4a58212e4d32d1f58926b73ca33a247326c2a5e9fd39268d2384e011a00000000000000000000450cd1132e85279e093be4ae967a313b793f7fe0bf579e0f0852e003a04ad39d03000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 fce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb4 {"feature_digest":"fce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb4","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"440c3efaaab212c387ce967c574dc813851cf8332d041beb418dfaf55facd5a9","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"DISABLE_DEFERRED_TRXS_STAGE_1"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":56118,"consumed":9696},"cpu_usage":{"last_ordinal":1262304002,"value_ex":255807,"consumed":44101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 163cea51d12265063bf77437db57c2e9c1ef93dcb7205808665ab4cfc9bc7be103000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910100d007000010000000000000000080000000000000000001010000010000000000ea30559ce3cf675d2f9ecbf427930685680d9117ba72ed64d5d7474fb50c8768a921d218000000000000001800000000000000010000000000ea3055180000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220fce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb400000000000000000000163cea51d12265063bf77437db57c2e9c1ef93dcb7205808665ab4cfc9bc7be103000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910000000000000000 +DMLOG APPLIED_TRANSACTION 3 163cea51d12265063bf77437db57c2e9c1ef93dcb7205808665ab4cfc9bc7be103000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440100d007000010000000000000000080000000000000000001010000010000000000ea30559ce3cf675d2f9ecbf427930685680d9117ba72ed64d5d7474fb50c8768a921d218000000000000001800000000000000010000000000ea3055180000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220fce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb400000000000000000000163cea51d12265063bf77437db57c2e9c1ef93dcb7205808665ab4cfc9bc7be103000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 09e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc16 {"feature_digest":"09e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc16","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"a857eeb932774c511a40efb30346ec01bfb7796916b54c3c69fe7e5fb70d5cba","dependencies":["fce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb4"],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"DISABLE_DEFERRED_TRXS_STAGE_2"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":56859,"consumed":9824},"cpu_usage":{"last_ordinal":1262304002,"value_ex":267382,"consumed":46101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 0ba60f7118b04f4981554d97fcd15865c4ad6633f4e78f216d034a9ef6394e7f03000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910100d007000010000000000000000080000000000000000001010000010000000000ea3055b76acc0a0bc58aae737e94451f7f38e72ff2e66e45b1838f558f7266783bf69719000000000000001900000000000000010000000000ea3055190000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed32322009e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc16000000000000000000000ba60f7118b04f4981554d97fcd15865c4ad6633f4e78f216d034a9ef6394e7f03000000023b3d4b01000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d910000000000000000 +DMLOG APPLIED_TRANSACTION 3 0ba60f7118b04f4981554d97fcd15865c4ad6633f4e78f216d034a9ef6394e7f03000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440100d007000010000000000000000080000000000000000001010000010000000000ea3055b76acc0a0bc58aae737e94451f7f38e72ff2e66e45b1838f558f7266783bf69719000000000000001900000000000000010000000000ea3055190000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed32322009e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc16000000000000000000000ba60f7118b04f4981554d97fcd15865c4ad6633f4e78f216d034a9ef6394e7f03000000023b3d4b01000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440000000000000000 DMLOG RLIMIT_OP STATE UPD {"average_block_net_usage":{"last_ordinal":2,"value_ex":0,"consumed":0},"average_block_cpu_usage":{"last_ordinal":2,"value_ex":833334,"consumed":100},"pending_net_usage":9824,"pending_cpu_usage":46100,"total_net_weight":0,"total_cpu_weight":0,"total_ram_bytes":0,"virtual_net_limit":1049625,"virtual_cpu_limit":200200} DMLOG RLIMIT_OP STATE UPD {"average_block_net_usage":{"last_ordinal":3,"value_ex":81866667,"consumed":9824},"average_block_cpu_usage":{"last_ordinal":3,"value_ex":384993056,"consumed":46101},"pending_net_usage":0,"pending_cpu_usage":0,"total_net_weight":0,"total_cpu_weight":0,"total_ram_bytes":0,"virtual_net_limit":1050675,"virtual_cpu_limit":200400} -DMLOG ACCEPTED_BLOCK 3 03000000030000000200000000000000010000000000ea3055000100000001000240e54a7b27e042b80a810153bec1dd166eef95fa69f6c9886ae283363bc2add80100012d5b1b639d6ae94fcdd0536b224644931573d1ccb2a0c548613cd1feea18888b0200000000000000010000000000ea305503000000010000000000ea305502000000000100000001000240e54a7b27e042b80a810153bec1dd166eef95fa69f6c9886ae283363bc2add8010000000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d91023b3d4b0000000000ea305500000000000213588be25132b4167ced6df22b5439e376d5a20284190bb94a43e3e8026d1e183a540eea430e5cbad5bc491bddec73f7eec3e61d3f16dfcbc7bdc894a93b2e0bb30fa9132d61c575656be9a25e72e1825d1ccfedd30477c6c0e70409000000000000001f07b6d3345de9c34b50cae9aa40fe5287cfcc94617412cf5b261099eb9938c1c0263a0bda9c49329d86843f04b30cba694fb1ab2174a33dc1406ae7874e9523080000000029807708239aa7de914d3ed61e9009ab2280bfbc50f1d9769f27f8341ef26198000000000001010ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd0001023b3d4b0000000000ea305500000000000213588be25132b4167ced6df22b5439e376d5a20284190bb94a43e3e8026d1e183a540eea430e5cbad5bc491bddec73f7eec3e61d3f16dfcbc7bdc894a93b2e0bb30fa9132d61c575656be9a25e72e1825d1ccfedd30477c6c0e70409000000000000001f07b6d3345de9c34b50cae9aa40fe5287cfcc94617412cf5b261099eb9938c1c0263a0bda9c49329d86843f04b30cba694fb1ab2174a33dc1406ae7874e9523081700d0070000fb05010100203b7de491b51d3d74624078bc2c5dc4420985f0350afb6923a5585b5621750c9f126d7cff0efeade2068c7b618fc754b2abb5bff8cdb9bd0ecb4432b72ae1ed380100a82f78daed5c7b8c5ce755ff1ef7357b67e3ebc6d94c3609f9e662d0b8a4659bb8eb2575dbbddbc476694b9cca2dfea3b0bbd99d647776bdbb9e1da70e0adead081045158a7894b6405524a4d21424545aa8cacb0d0815a94891fa20414284ff2a025511a245ad54737ee77cf7ceeccb71f09a87545b9e7be77b9cef7ce79cef3cbf71f44fe94f1bf5d03d9f1951f447e343fdf3d87be873f2879efef473830dea77fff59e7bbef7f440d3bfd197d9f57368d1bfa54767949ab11b9736d48cd9b8840f7a0b372ed11f35136cf0436fe80dfac0b80dbc2afa67f84d6306e6063201ad97a8ff9234d00880f033d54c84469e48cd68b03c8b3ea54dd0909531c1fc52d0b0ed95c70e2dae4f3fd29eed5de8b6a767e77a8b8fcdf6daf32a42d7cd6bdd76d9548e51317aeaedd5f5c5d5e9d9f5f576b7a72c9aa273ed73ebed9e4af025c3b4d595e9f9d9deecf4fae2cfb4558d9b09defcf4409f1a2aa7cead3d2e53ebddf6f90b8b40e6426f41a568ba89e04eaf75171f5b5c6e3f4ac8d519393476dbebab17ba73ede9e5c5738bbd75358c9e70f6e155c24ae17d44a6aeaeadaeb7e7f1327f61aedd5d5737a1d3a1f3e1e5d5b9a5b985d9c595e9b5d9eeecb9768ffae9756e8956e29db9475f6918efa23e77a1db6daff4a67b8be7daea00d316339982ed81b579743afff0f4238b2bf3d38be347558696da34d17361b9b778af3a88ef0707693c3db73adf56868958aed36dcfb5097257d61a2280580ef09890d1fac2ec3d6f1c57af61e4a877bdb74a6445ffcd681aa6a60b6bf3e02dda0ed993275414abb8369444511c0f0d594b9f517c8b1e31237624a07ff4371cd123d60e51efd0adb7da86ff63ab8f46725b10ea353d34145aad7434623774b17959a51baaf8d45f568fb8a6c3d9b5b5e5c7d5eb6a07b42a745a7bfdd83d47c727ee7bd39b87fe66539f0854767bbaa9b5dd3093f2d7a9078655417f5be683f4a5c81ecb752737e3f44d5a9f9cccad539d22ee1417cfe76a9c1a9c29b29e53ef1ad64e4faa62e3c4b0a9dbb45007e81ff5e90e663b4d2fe83d39aca9bdf8cdcb2a33ce1e489d4d8d4ac7b5def8415a6e29a755c64d9d66d262f59651832ba175dc6cd2f3ad0a40313352c533b4f3ffd03ada2854d3601718b7043ccf3b757258611fef0076d96d07d2ecce62649cc0127ae5968b8d4e1e38ddc96ecbb17da75c405b74f67c6e4ed034553cd1c92da19207457c3ed70f0c1b0c21ac685a71b19387d4d78c9c75da192c1c776901daf9131d02648088f62d173b2e62184ec68434c5f29bca465367881c84970c54f4d1c22c80549d0a2430a126fe9ede4b742b469a9637a28be0ed843e6191fd00d024d49de6bd366d0a5a6777d2dc74429b0dde36f5df9e6bec7a5859225a9339fce1c9dc60ae39a894d39e26292146a426345d7a93f272c2484b6b9e2e1154e1a0398c01a6a8778011febd839629d7b3d95d34d54c62415e4c31a2584ca6381a31acea26051d200bf4245168a23feb1ca6d5d2043cd2d9e1eda8f8f61f4e43950da9f42744a85e22fae9c3a08b2e5e0021137ecde82da8ded0adb2d78ef257a75be822622d65756a7949d1bae92fd774c0846b1104fa0872b354c43fcee7e5eb2cceaa08c0b2a62194695a9245a3dc961b6c411509c9112f456fcd80799088f838bb54d8415018cf5c23410b00c783082a10f50e84dded3abb44840118013088481f4a76fd881cda17441ad78fc81dfb8288bb7e440eef0b22adeb47e4ee7d4164ecfa1139ba2f884c5c3f22c7f70591cb6a174cf45e9898014c4c05e33982a10750d17ba2a2050223a0592d1118361ae9778cd51be612eb3957aa3975c4aadc4cb9a78eab14d660aa456f43fc36466f357e9ba03728426c01e32d8f870db33cdef01bc66b7ec378b62d9fc883fbd4017a0b8ae4b1fbd44dfc96d1db30bf35e8ad8e193c2eaec645d5b8b01a17f0fa0d5edf1c57b70aee99c7e5f60a97d10a97db2a5c1abc0b8cbbb9dae36baa3d1eacf69809ce8a9118e10581c42db234bd1d1264d57dea2e2107b5fd4035eece6adc1d6459c844b286602bf4adefd3fe7f92f6da533efd522076fd194daed5619535e0fa38f56e78155bff121a57aefcf1b77ee7d73ffde2d44f929380af57ae7cf6db5fc35720b9b9b9f9fca7fff04f3e72cf43c356be5efe95ef50ef43c3817cddfc230c7ef770e22c7c910f12ba05b9544fd1d3d923f6297dccb263414ecb8f8ed693d42f71e55b1f7e71ea3dbcc4339f7cf1c57ff8e047bef6f98d3ed0bfffbddfa0efef1e8e05ea3c3dc8c59e119833c76c4b409205c8de305a8f539ef639d94705e5437ffbf257805a244096e9419a6541802c1cb3ce03719decded17a94fab537bffde13e10c0fc28808402e4494c08c8c5f6fbdba4fd251e4ed2c9de385a0f531979861ee1b8392de34e1fb3137ed844273b365a0ffcb01e3da271b326c3d68ed9861fd6e8643f365ab77ed83be9118f9b5332ecd4313be98791a20538e3c73d013cc6cd451977f198cdfcb8ac931d1fad6b3fec7df4a88d9bb332ecec313be6878d75b2b78c52f891dd415f9ed190a6d7283eb3194e0bf99b27b324fdb2d131046c8ce4ab19389231e8eea0198a568f24ccc8823c7e4064cec5c507d8f58eb3db9a86d1a0a6039d62ed3cbbc37007e32c240f3f2848d65b2e98526010b5769ab010ae038f30f1b0e277b025f8f92fc012a09310635fd260540df077b6d2bce4647f5eea12572b34fae9bc53d4007b414c1f3719351cc2e45a47da98c714f14094031716fa8220d5eabc4ea926751db1ae09479bbacec3d7e6082462fb1461abca25c5157dde4507b51a2086c978c36344650a3d2378e671fa73468757a36d79743d753d30ed296b52d09ec5612f0283b22d4fd91dd44c795b25e102f218997a4c0750d45614c9842289d0ac0145dae9d3e6886dbd0245a283666f5a0cf7652e3b927edb50e84a24f9b8b911f2f6450ad6157d667654f6725c1e13781095c6095c40a756866653a3bc550e555cd032934211daf1045303a7069d09efb9ea4c8ed96760595ee05e97205a1662d29e4bb22a1c7fa6ae9359cfe89cb9c55d2f6881ee71268c99452f700b562d5b1a1523aec20199181db4bb70e1e346d870f3e0d1c79cac96feaa3511197562c7a6be91227a4a1e93f2382d8fb3c29aa3f218ab38045e819050a478bb8c2816e738036dbe496c7b2b734d58365171658c8f34c2d75d5846ebcdc8eced1c6b0d722c138e3564d24cae847bf4581304060ec559728fe871baa9f138454a891e93cda1abf069c8c125c2790976e1d4a6de7960ee4ebf6775c207e6867108142639236748b4227fcf8884fefb560ebe02cf66fa3cdbd4b229614a764ab856bb1ad78840bb706d53ced910b85613ae65c0d8d5ae81718cc54bb2c31a2ca4eaaf98418892b289d978cc2ec8db647f6dac54cd430309821d9c450e083949b2b45f31bbb673bbb9f7b9f5d2f05e4e35e586844ea48239adfc6095dd46019b2246227596a5a3900f24d5c897ec33dbed18927e2e14b3ff4db5b71e8e2b5d9c94ba38f1eb267d5d9c6c93aaa4b4fd7071f6949a44a4060a93c5252b46af76aa9f17f9a8ed38d5a72be161d1b986537d7a40386604cfb395626a99fbd91010518ab173cd9a77ad2db8572bbef6ec575ffbe030ab7ea44c3397c7d43ab6ec7d8b182e223fcef421e535c0d2a77032e9f85b56ebe8815339b682d93966a4d726348cef82e03b431009d0e9a53c06b221840833428f28fca9af13a231231a6e4174461ef38209a000d1b08f682888f2bc15993a2f324be42e6596e6cd88d6f1d0e22c4fa5fdf440fb99b23d19907119c6f957efacdd4fed792a6a1ab27f2015ce672d957a25426f3763619dfd083b3a2f3e074727ad952a33fd4598347de34ddae92d7af1ecdede06fb1ba52dfb22f46243ccbad8b2c957f040763767c99ee6ec2a0ec8cc80ffb1b6c5b5d8d59c5d456f95562cbc8a15bb8c8481bec479f2cb8a83576477103b2134297833766a03e859f16345c3e5014e2ce144f8fbe347e87338f7d17ff9cc37de40bccf5038390595c4d11069b50772d522cd826f2758303e7b993d600b7e247ed49492c8ee0436d4cac3615d2f87d4113d31a3127ecb3a651878d20f7e6058a7a20b8abb3b790492d3493b816202e9da850e1020c1715cd2e19ac0034c1412e8900b3329c7b818a4a038c326b5442e947a482ee11feb6eff967ecc4af4b0a93df57212ab2306e25629e6b054cca1e742d857cce136e90dbd62862e15511a70ca4eeda2a343d6d1c66ba3ad815acb1c45be8e75370825dac2727c717440afb364676ff3ca3de21e7a1b14e6ad2e40eca2bd1db718648f2a151f5d9be326fa1af179c04a964f23407ad373ff00fdbc66e20a9868a6e24b34d070054ab45329e15f30da6e38613b54129f42944b2cca25c1d2568a599fe40cc08a40086639cbca8bf9c04cb15c21c6dd3f90287bec23b44687a34186a6010df5a3dc6e83a6fb395d55ca871ec8e932b4f4dff50d2261b00709d51e2095b84c7b8084d0ecdfa6bf6e593346bcf1a069a6147c3bae9271dabb19d2f18e2ca7f470d0d4db7989efc2d471029d4b6e48579071e69a73cee2097b75459d7711f21379d4fbfd27096e54c49d664487980c1249ee79d2435ea9f20e12d9526d891c083a7af613b97950aaaa2e5ecadeeb7bcb8de5c949d699d0facebc0b03a983cc81613726c1eee85b728274a564f0835229d2eeb4f5cbd2495adaa14e7857b52a5bc14dd007466aba21a8e469a2b7d124d84a934068120dd224649a18a189014d42170dd0049ed95b0cb248f5bedcb868a9703bd0447291c8da1c40b3e93940be207c54a4a6b886bc7b117510e2401155977b7f1545d441506511065af8da8aa8bb2162b13bfbaa8ba8af0e9143fb8248e3fa11b9635f1071d78fc8e17d41a475fd88dcbd2f888c5d3f2247f7059189eb47e4f8be20b27b11752f4caeb188ba072aba84b05b11f5b7c52f0ff7d1fa243badcfa0a68d5cb2cdfa88ed89c5ba180a3b617822313ce4122f650f55db492aa32ac3c5b925e55d591f52c61c4103346f04d4499660a128307e701712259ca6a0686e2bb738620389fe53f74397cc27502417c677740825f24bab6b48755e104ec1521e88c7b8f1ce61d6e6e46052e81dba402e3489b3cf8fa03f5130266727d7127d87f065450042870b65e4efa896783641cea40b386e534211cd496d89d4789ce65d6a7642602ea55261d877e1a00417a5b0469efa6b46c81821b6fe0b6b62899edd12a79ce47a13416de4108f3b1855443db8d34456556e6d69dc1c433585c2a0f0a4bfcf147074c48d4027e4ea1c9132aceea269dcb2cb0ee54c30d0ed0301b22bf0edfa910ba49183f2e21b12d20588700a0d3bcc63b343a374ba98ce0a914bc8ac629a6cad8684a5810d61c3622925253cf062a7b86bcbd8d82585e3b1a0d551445308dce98108b526112af5d4ab6b75779010321fe9dd61c70f725aa32665158d143697eb10a2b01cc41c82e32d92405471e94a3e90612401c97eca45083c25b8268fb4d1d41e0ce8076632174bd2a67fa5ad2106a2649c079c11d2888b9504c57fc69b03ba4896dcfc1037be2c3b66998e24f0e18f983d667203d9e6e771760b4d8c789c4cfcd873c20fe2dfe94e19df97c5a6b314ac09050981a3ac1d5bd9ad0c0195f7337251b13375c94553fa09faf8d9f7de4e6c232e51b0fa5d4d7e93d4cd82c39c1c3a46b84cf2da25da4ffb1217d21d874a0a071c1712754422ac5c05e864ef1b958188092d5f02909091a01ecd43cf46f60724b28fd9aa7b26c6583e41264cea100a706249b344b44b6622b49296b48eeb94c50a30904f218e9b5c4f844a75c8b130982d4c948a59fa211b0a0b858d14ae8b0ae228c9ee0c4228a4b96bb72004210dc270e5d930600b1c3026c54f683635ab00d6fa688af860cb443a244c1583c0389a4a7e01d9bc3728f5641e4c4d3cf524498b2e363ad80cf5b1f9206340d0ab2081149a08de95e7fc098c40c9b084430c670cf840c2c30f80c1001c72a3194cc61aa744850e3d04b1b03d3ab8d9413ec822bd068f000b0550d7b21ea77848e6d0820405be34e44ba3c3bb979b21d294f9a6ac6c324898105f3eef85321bd08c03a944affa37399518f854a264b612a46b78e9665837e93605c7df919d97b17e9c682fbe3dbc5d7dd9d216f910179773b795c36d3596d57b7a3f85d95244a87095c41ae3ab3cbe7a2fd4522e197c1fc80d02f26553a9bb6d92b5975c9529ea3da1226175581e8e9d003afca4be5a223c8d1dd6b1ca4d86d089879b7c07a5515d1e6079e220f730fc4f674e6e99ea7c4a6fcbec5b315b97b3f59eb3ab0923db26f00ea026b3fed1701dc9cabe6d5492748924e97c0ed7882d6435fae7b86830703b4af160f1a12cd9b407799af2ae171cad3c821f620a5c698a59f511d988b0c5f7a8016e3f291dc2ab0777d1456fbf1dd503b80a996be23700e23d231d6c71ef05b7b3011d3bf7fefb062960728e82342d8b6b900cc5e50dbec311c38292e1586a4afa350f91f328e15902d5b4151ce636bcf6509cd8a85526bf902f5e62d5e00b4f7cc58ebdddca313462bd02c9e921b5ca387a6374204d9fd7261057f07f5de10d68ba6d6a8ec28b4a668ed804fecbeb540c5394c5d81d5f712a95e0a70ced28d8eedc5edb8e1a7e478d6bd851c38f7ba51d855e77e73bb7c585403f322b4766db062503831a25811a7bd801efdd8148311e194556f468346b4cab1ae221176535ef4aa65ff6d6eed590ea1a69b4cfc4317b11a74ca76571b9a9bfb6b2295454fcae08e7607b2565b3aaa404a2baab4a4a807d04be9262717acec8035703032e989c159d754a640147f079ae90f81a37d0872a65dff3ac04ce72a710f181af81841c78579d196a20b6ac8184acb2b8936f32c9302e78707dade56f56a20632263d6b825352ba0e16c569cb65eec0578e41c4c1dab154bf387e0dfaa5635b2e17c0a3adc0700c2faa861597e8700e1ffad5e320f5fa3b9b280b2c81e86e0616488598c1f5dbefe7769ac8451714c7a02d898f57d1edb4a36dea1dc96dafe17d65bcf82a3dd99b868e47bf293ef9d5676f19d0f2b401d6f296b53c59956552f441a5e80df39698a53c4dfd83ec68f9e6aab746f596f937291396399eb1dd6d848574f66d44c0587438c5cd2ca9ec036cf37f0b0de3ebb0c8d80d9a1672b079a95dac8b45a2e2f439ee36e2e48b8db192b550550564771bc377292cdb98a735bb4ffca3a5fdf47ccec8e3b4f77ce450ca314cf8d69fe8047a3f22878e20fcdaff19f79e7434a3c746ebefac0dca7bf7dfbc36328542a6edb820b046600432719855c908c5604614532916a51dc32363fdba353d22d40c25b264e141fc88e82de6f851fa0349af1889da620490914b38808c3880440e860248c3c16513f65ae35786fd00d2ec08206309203d9c12f92a808ca6b80254c19100d29401a447c5226ea72f6500697d00197b3be92355e5d713a3238999b16dc1a2646ac606e245d6be134c3ebc8d41b32bcfd0ec6ed1e3c48a97becfd8ffff8cf51750b65c46aa38fcb211ed36e06ddc30edc657387689ea5ae68c04575f54db8239f95583c21d259e3d51a9c80984574c3ab62bd2debfb351fa2b49df5f09d88a559dc9167f25e0247f69659ca9fc9586f82b6ec05f69f5fd9506dfb13c25f8bc593c83898168ef7819edb16790fea93656c29531b92dc3e9b631e7adb35c01e3727499d6e15008d849b3385d64ef9638319907d92dcef6af04245d64f6d8be210d990cdc472248b8432a9797f8f46523e3e668992de55ca7de35d729a1aa53e9b3b8ea53ba3241e5b634cec1ad82dbf229f257908c2c9ec50b0e635956966141f1157268c47b09e0bdc470e7254625ff212e1ae2bd9832f41c702bb4fca25bfb4b4174e61acb79826461243f15364c32fc34462ea121730a88b0635c868d7c0e5c2e0918c13f3ec1ee2049d102d7fe49ea16fc85002be94fc0ae8acafc3b702f455adcf7b5f2e46906e10294915cc077a9785d5d9574627f8904bb8a21f13edb8a7ed9063b20a15ccd22152117b762a0148b24c4e5c5ad7e469696ab344d799b2b4dffd1a6fc93fef49d8fcc2e2eb7e75d6fd5cd2e2fafcecdf6da6e6df6d1f6ba5a7db8d39eebd197f575e95fecb5bbb3bdd5ee34ded7ddca6acf2daeb87317967b8bd38b2bf3ed8b8a7f0c99def9fe2e0d55ed6e77b5ebf07f5b2cae3c5a4d567cacd310ed8a33e0e9bd73b32b0036476db4baacbb0ed8bdd98797a9e111374bfd0bedae9b5b5de97567e77a8aeb00e9eb77e0786e757ef191c7f744efe581e5fcd06b5cee63cfa9f44df21f4350bb47786176e551225777f1dc6cf771b7d47edcbd7fa1bde22163d7b32b1ebe62cd9ae66bddd5deeadceab2f3ff71488969ffff18e132651a3cdac61cb22ce9dd1756da17d70806ed50684aa83eb278b13d3ffdf0e3bdf63ab05cef752fcc097569ee1f349552ff05ee7357f400d00700008101010100204b21f3cba072cc493e70861540df4677b498b0505a8b8e2a346b85a0c2dd2fc4263c4a7d8629026c4eb594ad96fac2bfe5f8ffebb9c841c353920b7b8ec11abc0100d90778da8d563b8f1c4510eedbf7e37cf209d9e60808402496c0dcdaac4e8ece01090112afe83043ef74ed4e6b677a86ee9edd5b3b2121b049888d842c84c0c1456702eb20b036424242c2e00408800c24fe03d53db3f33a58e860b6bbeaebeaeaaaafaab7f55bff9d1a796df0e5798263c37cc89f2fbe657e1eb8c7cb92e0de5f83c1eded95e4fded2d08150faf5ea5237e69f7855db2d3c199e351e5915a339c0b900d4103681849dff5c09daa3818bc34ec5057f319d54036b6c640752cc1617c024a17515d1a6b2f945c2f48a3ab3d09ca0b7dd68ab9d097078d292cd4267e9c39f089a70faea351378c85563b11c8802bf44c383eccc0cf20cd39e55a9d31df4c766ee487eed4f528174e4425baab412ab2fd44400f1dab73046827567402f6ece195a73495139455b44ee4ead4bb1db3594b2a94b929fa51367179f0f4882adc00722dea6c6edb0798d3452a7fd60d858643ed8c2598c8297bf18227220efe2f948148a1851bbb515c72a47ce34cbbeec655133b0106781de0c9aa059f8f41f3200b19833148090c41870e1c465c528b9b73c1c2798a3a57b5c2c0cfe276de28b9f0b90027552b7e6375c085d35a0691f6ac7a7768c39351b2a4eabb54b8e0dba3486d2b597131b1f0b3553ab68cff9c15a9dec3adc83b0327b5764a645b3bbd7c77b2ce294f6a755cf4a278e473d7c1692b91a74e75d083a9b5d828596cb8218364a6175132eb4b782fe61202581d2b906ec926dcee4a2cd2302de6ec9354785ea52d5bd5900bda21ea652849adab4030243b676debdc60af83126d32d91c2d34a85341c20682e6d233ab41b8f02f154e6a05e4e9b897c2b319c990c52e3a859123b533d932bbdf76c276c527c2e4b21ceb4d8cd8aa8bb1b56dac6d90260d1b8db10c036bbaa54063abace4ba8ea2241c3da3f77980ddaa92bd2e7628c7629ab617f54c2527174b05a6ae8a8236da3229af186acd0293fea689c65e7716ccb0eb61a892b5e548eeca2475a55ec7d3d32658c78357533c329d62a2b5eda28a6cb492c93f3758e35524f9ac128236578e11276e742c286468aca330a42cf661ab98b783ebbd58643cafff27cf7b71c4685a678db575669c5f1543c3e0735af70bef07a975ec4a819b769132cbcc6379f1637c36f3278f7c7debe2cb1f7c7eadd434c8feb73fdd3bfaf4956223c0f1fcb4fec587792193fd4fee3cc31edc2956278e5f1fdd7cfc59566c1fbd39fc19d8d14999a138ee42707492b171f5c0afa848c877af9e78c7cb22f570ec3f77fb789951c882be4940930cf4f0d1db6fdc5f16528fe3ddaf0eee2fb324e3d8fb1e057942cd851ffef1fb8fc5fcd920f8af3f2e66c9fcffb84b7ff865b7ce875708c9ff60d8f137aa5a1fa900d00700001001010020742877c36a520b152b1337ea1ecd37b0c98ad07289c32fec392e7eebab9f0ac71f7bc8c718cfa75317b2e15702372a9222c4616783ee7b3f0ec6358f8c328eea00005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232201a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b72410000d00700001001010020058e23368b919493d6ac61d27f66b829a53893e88ddde857d3b82d913960960d22fa36f397752b98c295e3b31927f740127c0a99e76f8bfeea88f44466b8fbfd00005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea990000d0070000100101001f43fe868e263d8134cf705aa85e26ce78ebb058edd558865fa3d240f5cb9e50c2389e9c8276eac800b7233a552045b2e79124c97e5156a0649849cc7f5d09eee600005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232204a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0f0000d0070000100101001f29e82b08ccf15e2187f29fea11ee3f4974f41b51e45b19f353348d8848b86fb71cadd88630456b7a1c60803c7b402487d41fbf18f0b0a13b4cca1f740447938300005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220e0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff5260000d0070000100101002047a8b784c3765b5c63ac52e3d8461b80bc2d3e3f62434f8accb277d9f2487cfd3c0728fcd26b5119a11288e5db46bc5b547877e220971609d1cef8cba443340800005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed32322068dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a2974280000d007000010010100203e701fbafd4149bc95b55a6bfc3b78246f5c2668ccc05ed4059a36ceb38f140b31e3b69e15f2579571e5bde39e034947271599c200e540b3949112bef163074c00005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c430000d0070000100101001f0cc7352e60f4f8476783d6d1b48766a111c56fee2c1a552e76a75c92bc17de172f994ffc854c09717c904054819ca7a17379ddecaf531c439b35337ba099b81300005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232208ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a4050000d0070000100101002040965063a83be2d53b36c8d7e0775f503c2caa1407e586314562aace52c272fe60659e196413a6c9db4168470bcabb9a5851121c10c7b665f363f6cd4d1e4bda00005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232202652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed250000d0070000100101002074ea7468b2a031c4cd53bf10ec3ac66b0c4b5c8779e045f1ef8d9c7b116be649217ff340107d0163397b99918ee2ce822b66cd6fce7b385af97a04671136e2ee00005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d0000d007000010010100204dfb21ca5140582379bc026792c16b4cf97827143a4a9cd99ae70b3e6016cd6316bcbb9f1cb1233f12a0bbcd9debafa64724d0459b5c8d3cb67ceddfb2e3962500005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232204e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d670000d0070000100101002033446a3a94ade71dff3edb786259679487ab701bbc147490b1d4159fecf545fa22fee0698db16bf616465e5cebb985bfc4d9ed1ec4a55e38997dd4b4bbc427eb00005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232204fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c20000d0070000100101001f3f67edd35bf731a07f40c638e8812112cd7d1baa39ec7dac4a1b2f0c83ac8bd53689b56dba69a7386e3860a6f8976695ac0bc2b5dacae91080f1d54df2dac0c000005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b44767070000d0070000100101001f1e030564013603d54f9e983b63cd940f8ff09ae038b14813f4021bb0c09ebb640d90cb4f8d57be2809f492a51737b671a5f549d4efa8e7efdaeaa9663c09d1ad00005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead450710000d007000010010100205cea642eecf05568ce8c5564e63349eea3b816108914ba2ab5efffbb8ea467265f0b6d474f03ed02a3bf529fd6e55a595cbf8dd1adf4311cb9c51e862f8a535400005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232205443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b40000d0070000100101001f4556076cc86e0840bf69664f1ef8fcd4d91abda313d08e7840d24ba45cb429cf12b7d3a1f64250c19d1b975e7b107853beff70ebfc4c27c44f825dc05cdc9cd600005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e990000d0070000100101001f354d903ad0f2c6cc9d9a377d681ffaa00475d1e559e48074b4c8cce3111d5c172903b2f179ad4d736dda4e7d1b6a859baeab9dde5e5e495ce09733ec4650634400005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb400000d0070000100101001f1766fa716a828da244c9ce52919b7a19acb38dbd110d1bb0039bb2477c17e4465dceecb8330ed5ee9de1330930dfcfa1a5e8149ce8536a82c0093642adf7328200005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232206bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc0000d00700001001010020488923db1c78fa430a3a9eab75f4ee467c7b9a3d3b4eb3bd08e183c82ef79b9102a4d2a7d1ec79c96b404911ae1b10f579bd82a660011c1ca2b872b30ef7dcac00005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed32322035c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b0000d0070000100101002031ca6aeda725c01ed6aa6199dd2767930803051d3bc2897956bc9f97f8db5abf3bf243b775b4020f0c96d8ad197d591d11f8a51760c19fdc81134eff06a1941f00005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed32322098c4175db53ed27e7911a1b5adf0e7db0fc96c2cae172cf594dfa9a742ca9e880000d0070000100101001f184aad2b65730f7485957642fa1688c66e8ece7827ee2e8e01f8bc904cedd8ec5462c12a1e3c6cd41f4a15a350ec8575bb05e9597f4316ff73a4e1066aeab3d500005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220fce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb40000d0070000100101002041c996b52c4bdbbc4fbdaf707dd01e74c46c51ce2c8e10e174e12502cb6be3f23e2d44e8e8802e970bc5ccfc4d056e400c92a56667183c37e0f79fbe77540a0000005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed32322009e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc16000001 +DMLOG ACCEPTED_BLOCK 3 03000000030000000200000000000000010000000000ea3055000100000001000240e54a7b27e042b80a810153bec1dd166eef95fa69f6c9886ae283363bc2add80100012d5b1b639d6ae94fcdd0536b224644931573d1ccb2a0c548613cd1feea18888b0200000000000000010000000000ea305503000000010000000000ea305502000000000100000001000240e54a7b27e042b80a810153bec1dd166eef95fa69f6c9886ae283363bc2add8010000000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b44023b3d4b0000000000ea305500000000000213588be25132b4167ced6df22b5439e376d5a20284190bb94a43e3e82f7d596eef522faabf96b279df52ed6aca4107c87b6d789038d6f3ab4cce7311075993067e6f396bd6073f497bfeb8da8ad7850ab7a28e75602a6ca92df12a2a000000000000001f4efab24108b62d2edcccf3ffec0ab6382ee0cfef4d5653f37e07734c76a3535d0a131a9f342707a49d910a4521a16815a28c8c0dcf017ef30ded2fa875e894d10000000029807708239aa7de914d3ed61e9009ab2280bfbc50f1d9769f27f8341ef26198000000000001010ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd0001023b3d4b0000000000ea305500000000000213588be25132b4167ced6df22b5439e376d5a20284190bb94a43e3e82f7d596eef522faabf96b279df52ed6aca4107c87b6d789038d6f3ab4cce7311075993067e6f396bd6073f497bfeb8da8ad7850ab7a28e75602a6ca92df12a2a000000000000001f4efab24108b62d2edcccf3ffec0ab6382ee0cfef4d5653f37e07734c76a3535d0a131a9f342707a49d910a4521a16815a28c8c0dcf017ef30ded2fa875e894d11700d0070000fb05010100203b7de491b51d3d74624078bc2c5dc4420985f0350afb6923a5585b5621750c9f126d7cff0efeade2068c7b618fc754b2abb5bff8cdb9bd0ecb4432b72ae1ed380100a82f78daed5c7b8c5ce755ff1ef7357b67e3ebc6d94c3609f9e662d0b8a4659bb8eb2575dbbddbc476694b9cca2dfea3b0bbd99d647776bdbb9e1da70e0adead081045158a7894b6405524a4d21424545aa8cacb0d0815a94891fa20414284ff2a025511a245ad54737ee77cf7ceeccb71f09a87545b9e7be77b9cef7ce79cef3cbf71f44fe94f1bf5d03d9f1951f447e343fdf3d87be873f2879efef473830dea77fff59e7bbef7f440d3bfd197d9f57368d1bfa54767949ab11b9736d48cd9b8840f7a0b372ed11f35136cf0436fe80dfac0b80dbc2afa67f84d6306e6063201ad97a8ff9234d00880f033d54c84469e48cd68b03c8b3ea54dd0909531c1fc52d0b0ed95c70e2dae4f3fd29eed5de8b6a767e77a8b8fcdf6daf32a42d7cd6bdd76d9548e51317aeaedd5f5c5d5e9d9f5f576b7a72c9aa273ed73ebed9e4af025c3b4d595e9f9d9deecf4fae2cfb4558d9b09defcf4409f1a2aa7cead3d2e53ebddf6f90b8b40e6426f41a568ba89e04eaf75171f5b5c6e3f4ac8d519393476dbebab17ba73ede9e5c5738bbd75358c9e70f6e155c24ae17d44a6aeaeadaeb7e7f1327f61aedd5d5737a1d3a1f3e1e5d5b9a5b985d9c595e9b5d9eeecb9768ffae9756e8956e29db9475f6918efa23e77a1db6daff4a67b8be7daea00d316339982ed81b579743afff0f4238b2bf3d38be347558696da34d17361b9b778af3a88ef0707693c3db73adf56868958aed36dcfb5097257d61a2280580ef09890d1fac2ec3d6f1c57af61e4a877bdb74a6445ffcd681aa6a60b6bf3e02dda0ed993275414abb8369444511c0f0d594b9f517c8b1e31237624a07ff4371cd123d60e51efd0adb7da86ff63ab8f46725b10ea353d34145aad7434623774b17959a51baaf8d45f568fb8a6c3d9b5b5e5c7d5eb6a07b42a745a7bfdd83d47c727ee7bd39b87fe66539f0854767bbaa9b5dd3093f2d7a9078655417f5be683f4a5c81ecb752737e3f44d5a9f9cccad539d22ee1417cfe76a9c1a9c29b29e53ef1ad64e4faa62e3c4b0a9dbb45007e81ff5e90e663b4d2fe83d39aca9bdf8cdcb2a33ce1e489d4d8d4ac7b5def8415a6e29a755c64d9d66d262f59651832ba175dc6cd2f3ad0a40313352c533b4f3ffd03ada2854d3601718b7043ccf3b757258611fef0076d96d07d2ecce62649cc0127ae5968b8d4e1e38ddc96ecbb17da75c405b74f67c6e4ed034553cd1c92da19207457c3ed70f0c1b0c21ac685a71b19387d4d78c9c75da192c1c776901daf9131d02648088f62d173b2e62184ec68434c5f29bca465367881c84970c54f4d1c22c80549d0a2430a126fe9ede4b742b469a9637a28be0ed843e6191fd00d024d49de6bd366d0a5a6777d2dc74429b0dde36f5df9e6bec7a5859225a9339fce1c9dc60ae39a894d39e26292146a426345d7a93f272c2484b6b9e2e1154e1a0398c01a6a8778011febd839629d7b3d95d34d54c62415e4c31a2584ca6381a31acea26051d200bf4245168a23feb1ca6d5d2043cd2d9e1eda8f8f61f4e43950da9f42744a85e22fae9c3a08b2e5e0021137ecde82da8ded0adb2d78ef257a75be822622d65756a7949d1bae92fd774c0846b1104fa0872b354c43fcee7e5eb2cceaa08c0b2a62194695a9245a3dc961b6c411509c9112f456fcd80799088f838bb54d8415018cf5c23410b00c783082a10f50e84dded3abb44840118013088481f4a76fd881cda17441ad78fc81dfb8288bb7e440eef0b22adeb47e4ee7d4164ecfa1139ba2f884c5c3f22c7f70591cb6a174cf45e9898014c4c05e33982a10750d17ba2a2050223a0592d1118361ae9778cd51be612eb3957aa3975c4aadc4cb9a78eab14d660aa456f43fc36466f357e9ba03728426c01e32d8f870db33cdef01bc66b7ec378b62d9fc883fbd4017a0b8ae4b1fbd44dfc96d1db30bf35e8ad8e193c2eaec645d5b8b01a17f0fa0d5edf1c57b70aee99c7e5f60a97d10a97db2a5c1abc0b8cbbb9dae36baa3d1eacf69809ce8a9118e10581c42db234bd1d1264d57dea2e2107b5fd4035eece6adc1d6459c844b286602bf4adefd3fe7f92f6da533efd522076fd194daed5619535e0fa38f56e78155bff121a57aefcf1b77ee7d73ffde2d44f929380af57ae7cf6db5fc35720b9b9b9f9fca7fff04f3e72cf43c356be5efe95ef50ef43c3817cddfc230c7ef770e22c7c910f12ba05b9544fd1d3d923f6297dccb263414ecb8f8ed693d42f71e55b1f7e71ea3dbcc4339f7cf1c57ff8e047bef6f98d3ed0bfffbddfa0efef1e8e05ea3c3dc8c59e119833c76c4b409205c8de305a8f539ef639d94705e5437ffbf257805a244096e9419a6541802c1cb3ce03719decded17a94fab537bffde13e10c0fc28808402e4494c08c8c5f6fbdba4fd251e4ed2c9de385a0f531979861ee1b8392de34e1fb3137ed844273b365a0ffcb01e3da271b326c3d68ed9861fd6e8643f365ab77ed83be9118f9b5332ecd4313be98791a20538e3c73d013cc6cd451977f198cdfcb8ac931d1fad6b3fec7df4a88d9bb332ecec313be6878d75b2b78c52f891dd415f9ed190a6d7283eb3194e0bf99b27b324fdb2d131046c8ce4ab19389231e8eea0198a568f24ccc8823c7e4064cec5c507d8f58eb3db9a86d1a0a6039d62ed3cbbc37007e32c240f3f2848d65b2e98526010b5769ab010ae038f30f1b0e277b025f8f92fc012a09310635fd260540df077b6d2bce4647f5eea12572b34fae9bc53d4007b414c1f3719351cc2e45a47da98c714f14094031716fa8220d5eabc4ea926751db1ae09479bbacec3d7e6082462fb1461abca25c5157dde4507b51a2086c978c36344650a3d2378e671fa73468757a36d79743d753d30ed296b52d09ec5612f0283b22d4fd91dd44c795b25e102f218997a4c0750d45614c9842289d0ac0145dae9d3e6886dbd0245a283666f5a0cf7652e3b927edb50e84a24f9b8b911f2f6450ad6157d667654f6725c1e13781095c6095c40a756866653a3bc550e555cd032934211daf1045303a7069d09efb9ea4c8ed96760595ee05e97205a1662d29e4bb22a1c7fa6ae9359cfe89cb9c55d2f6881ee71268c99452f700b562d5b1a1523aec20199181db4bb70e1e346d870f3e0d1c79cac96feaa3511197562c7a6be91227a4a1e93f2382d8fb3c29aa3f218ab38045e819050a478bb8c2816e738036dbe496c7b2b734d58365171658c8f34c2d75d5846ebcdc8eced1c6b0d722c138e3564d24cae847bf4581304060ec559728fe871baa9f138454a891e93cda1abf069c8c125c2790976e1d4a6de7960ee4ebf6775c207e6867108142639236748b4227fcf8884fefb560ebe02cf66fa3cdbd4b229614a764ab856bb1ad78840bb706d53ced910b85613ae65c0d8d5ae81718cc54bb2c31a2ca4eaaf98418892b289d978cc2ec8db647f6dac54cd430309821d9c450e083949b2b45f31bbb673bbb9f7b9f5d2f05e4e35e586844ea48239adfc6095dd46019b2246227596a5a3900f24d5c897ec33dbed18927e2e14b3ff4db5b71e8e2b5d9c94ba38f1eb267d5d9c6c93aaa4b4fd7071f6949a44a4060a93c5252b46af76aa9f17f9a8ed38d5a72be161d1b986537d7a40386604cfb395626a99fbd91010518ab173cd9a77ad2db8572bbef6ec575ffbe030ab7ea44c3397c7d43ab6ec7d8b182e223fcef421e535c0d2a77032e9f85b56ebe8815339b682d93966a4d726348cef82e03b431009d0e9a53c06b221840833428f28fca9af13a231231a6e4174461ef38209a000d1b08f682888f2bc15993a2f324be42e6596e6cd88d6f1d0e22c4fa5fdf440fb99b23d19907119c6f957efacdd4fed792a6a1ab27f2015ce672d957a25426f3763619dfd083b3a2f3e074727ad952a33fd4598347de34ddae92d7af1ecdede06fb1ba52dfb22f46243ccbad8b2c957f040763767c99ee6ec2a0ec8cc80ffb1b6c5b5d8d59c5d456f95562cbc8a15bb8c8481bec479f2cb8a83576477103b2134297833766a03e859f16345c3e5014e2ce144f8fbe347e87338f7d17ff9cc37de40bccf5038390595c4d11069b50772d522cd826f2758303e7b993d600b7e247ed49492c8ee0436d4cac3615d2f87d4113d31a3127ecb3a651878d20f7e6058a7a20b8abb3b790492d3493b816202e9da850e1020c1715cd2e19ac0034c1412e8900b3329c7b818a4a038c326b5442e947a482ee11feb6eff967ecc4af4b0a93df57212ab2306e25629e6b054cca1e742d857cce136e90dbd62862e15511a70ca4eeda2a343d6d1c66ba3ad815acb1c45be8e75370825dac2727c717440afb364676ff3ca3de21e7a1b14e6ad2e40eca2bd1db718648f2a151f5d9be326fa1af179c04a964f23407ad373ff00fdbc66e20a9868a6e24b34d070054ab45329e15f30da6e38613b54129f42944b2cca25c1d2568a599fe40cc08a40086639cbca8bf9c04cb15c21c6dd3f90287bec23b44687a34186a6010df5a3dc6e83a6fb395d55ca871ec8e932b4f4dff50d2261b00709d51e2095b84c7b8084d0ecdfa6bf6e593346bcf1a069a6147c3bae9271dabb19d2f18e2ca7f470d0d4db7989efc2d471029d4b6e48579071e69a73cee2097b75459d7711f21379d4fbfd27096e54c49d664487980c1249ee79d2435ea9f20e12d9526d891c083a7af613b97950aaaa2e5ecadeeb7bcb8de5c949d699d0facebc0b03a983cc81613726c1eee85b728274a564f0835229d2eeb4f5cbd2495adaa14e7857b52a5bc14dd007466aba21a8e469a2b7d124d84a934068120dd224649a18a189014d42170dd0049ed95b0cb248f5bedcb868a9703bd0447291c8da1c40b3e93940be207c54a4a6b886bc7b117510e2401155977b7f1545d441506511065af8da8aa8bb2162b13bfbaa8ba8af0e9143fb8248e3fa11b9635f1071d78fc8e17d41a475fd88dcbd2f888c5d3f2247f7059189eb47e4f8be20b27b11752f4caeb188ba072aba84b05b11f5b7c52f0ff7d1fa243badcfa0a68d5cb2cdfa88ed89c5ba180a3b617822313ce4122f650f55db492aa32ac3c5b925e55d591f52c61c4103346f04d4499660a128307e701712259ca6a0686e2bb738620389fe53f74397cc27502417c677740825f24bab6b48755e104ec1521e88c7b8f1ce61d6e6e46052e81dba402e3489b3cf8fa03f5130266727d7127d87f065450042870b65e4efa896783641cea40b386e534211cd496d89d4789ce65d6a7642602ea55261d877e1a00417a5b0469efa6b46c81821b6fe0b6b62899edd12a79ce47a13416de4108f3b1855443db8d34456556e6d69dc1c433585c2a0f0a4bfcf147074c48d4027e4ea1c9132aceea269dcb2cb0ee54c30d0ed0301b22bf0edfa910ba49183f2e21b12d20588700a0d3bcc63b343a374ba98ce0a914bc8ac629a6cad8684a5810d61c3622925253cf062a7b86bcbd8d82585e3b1a0d551445308dce98108b526112af5d4ab6b75779010321fe9dd61c70f725aa32665158d143697eb10a2b01cc41c82e32d92405471e94a3e90612401c97eca45083c25b8268fb4d1d41e0ce8076632174bd2a67fa5ad2106a2649c079c11d2888b9504c57fc69b03ba4896dcfc1037be2c3b66998e24f0e18f983d667203d9e6e771760b4d8c789c4cfcd873c20fe2dfe94e19df97c5a6b314ac09050981a3ac1d5bd9ad0c0195f7337251b13375c94553fa09faf8d9f7de4e6c232e51b0fa5d4d7e93d4cd82c39c1c3a46b84cf2da25da4ffb1217d21d874a0a071c1712754422ac5c05e864ef1b958188092d5f02909091a01ecd43cf46f60724b28fd9aa7b26c6583e41264cea100a706249b344b44b6622b49296b48eeb94c50a30904f218e9b5c4f844a75c8b130982d4c948a59fa211b0a0b858d14ae8b0ae228c9ee0c4228a4b96bb72004210dc270e5d930600b1c3026c54f683635ab00d6fa688af860cb443a244c1583c0389a4a7e01d9bc3728f5641e4c4d3cf524498b2e363ad80cf5b1f9206340d0ab2081149a08de95e7fc098c40c9b084430c670cf840c2c30f80c1001c72a3194cc61aa744850e3d04b1b03d3ab8d9413ec822bd068f000b0550d7b21ea77848e6d0820405be34e44ba3c3bb979b21d294f9a6ac6c324898105f3eef85321bd08c03a944affa37399518f854a264b612a46b78e9665837e93605c7df919d97b17e9c682fbe3dbc5d7dd9d216f910179773b795c36d3596d57b7a3f85d95244a87095c41ae3ab3cbe7a2fd4522e197c1fc80d02f26553a9bb6d92b5975c9529ea3da1226175581e8e9d003afca4be5a223c8d1dd6b1ca4d86d089879b7c07a5515d1e6079e220f730fc4f674e6e99ea7c4a6fcbec5b315b97b3f59eb3ab0923db26f00ea026b3fed1701dc9cabe6d5492748924e97c0ed7882d6435fae7b86830703b4af160f1a12cd9b407799af2ae171cad3c821f620a5c698a59f511d988b0c5f7a8016e3f291dc2ab0777d1456fbf1dd503b80a996be23700e23d231d6c71ef05b7b3011d3bf7fefb062960728e82342d8b6b900cc5e50dbec311c38292e1586a4afa350f91f328e15902d5b4151ce636bcf6509cd8a85526bf902f5e62d5e00b4f7cc58ebdddca313462bd02c9e921b5ca387a6374204d9fd7261057f07f5de10d68ba6d6a8ec28b4a668ed804fecbeb540c5394c5d81d5f712a95e0a70ced28d8eedc5edb8e1a7e478d6bd851c38f7ba51d855e77e73bb7c585403f322b4766db062503831a25811a7bd801efdd8148311e194556f468346b4cab1ae221176535ef4aa65ff6d6eed590ea1a69b4cfc4317b11a74ca76571b9a9bfb6b2295454fcae08e7607b2565b3aaa404a2baab4a4a807d04be9262717acec8035703032e989c159d754a640147f079ae90f81a37d0872a65dff3ac04ce72a710f181af81841c78579d196a20b6ac8184acb2b8936f32c9302e78707dade56f56a20632263d6b825352ba0e16c569cb65eec0578e41c4c1dab154bf387e0dfaa5635b2e17c0a3adc0700c2faa861597e8700e1ffad5e320f5fa3b9b280b2c81e86e0616488598c1f5dbefe7769ac8451714c7a02d898f57d1edb4a36dea1dc96dafe17d65bcf82a3dd99b868e47bf293ef9d5676f19d0f2b401d6f296b53c59956552f441a5e80df39698a53c4dfd83ec68f9e6aab746f596f937291396399eb1dd6d848574f66d44c0587438c5cd2ca9ec036cf37f0b0de3ebb0c8d80d9a1672b079a95dac8b45a2e2f439ee36e2e48b8db192b550550564771bc377292cdb98a735bb4ffca3a5fdf47ccec8e3b4f77ce450ca314cf8d69fe8047a3f22878e20fcdaff19f79e7434a3c746ebefac0dca7bf7dfbc36328542a6edb820b046600432719855c908c5604614532916a51dc32363fdba353d22d40c25b264e141fc88e82de6f851fa0349af1889da620490914b38808c3880440e860248c3c16513f65ae35786fd00d2ec08206309203d9c12f92a808ca6b80254c19100d29401a447c5226ea72f6500697d00197b3be92355e5d713a3238999b16dc1a2646ac606e245d6be134c3ebc8d41b32bcfd0ec6ed1e3c48a97becfd8ffff8cf51750b65c46aa38fcb211ed36e06ddc30edc657387689ea5ae68c04575f54db8239f95583c21d259e3d51a9c80984574c3ab62bd2debfb351fa2b49df5f09d88a559dc9167f25e0247f69659ca9fc9586f82b6ec05f69f5fd9506dfb13c25f8bc593c83898168ef7819edb16790fea93656c29531b92dc3e9b631e7adb35c01e3727499d6e15008d849b3385d64ef9638319907d92dcef6af04245d64f6d8be210d990cdc472248b8432a9797f8f46523e3e668992de55ca7de35d729a1aa53e9b3b8ea53ba3241e5b634cec1ad82dbf229f257908c2c9ec50b0e635956966141f1157268c47b09e0bdc470e7254625ff212e1ae2bd9832f41c702bb4fca25bfb4b4174e61acb79826461243f15364c32fc34462ea121730a88b0635c868d7c0e5c2e0918c13f3ec1ee2049d102d7fe49ea16fc85002be94fc0ae8acafc3b702f455adcf7b5f2e46906e10294915cc077a9785d5d9574627f8904bb8a21f13edb8a7ed9063b20a15ccd22152117b762a0148b24c4e5c5ad7e469696ab344d799b2b4dffd1a6fc93fef49d8fcc2e2eb7e75d6fd5cd2e2fafcecdf6da6e6df6d1f6ba5a7db8d39eebd197f575e95fecb5bbb3bdd5ee34ded7ddca6acf2daeb87317967b8bd38b2bf3ed8b8a7f0c99def9fe2e0d55ed6e77b5ebf07f5b2cae3c5a4d567cacd310ed8a33e0e9bd73b32b0036476db4baacbb0ed8bdd98797a9e111374bfd0bedae9b5b5de97567e77a8aeb00e9eb77e0786e757ef191c7f744efe581e5fcd06b5cee63cfa9f44df21f4350bb47786176e551225777f1dc6cf771b7d47edcbd7fa1bde22163d7b32b1ebe62cd9ae66bddd5deeadceab2f3ff71488969ffff18e132651a3cdac61cb22ce9dd1756da17d70806ed50684aa83eb278b13d3ffdf0e3bdf63ab05cef752fcc097569ee1f349552ff05ee7357f400d00700008101010100204b21f3cba072cc493e70861540df4677b498b0505a8b8e2a346b85a0c2dd2fc4263c4a7d8629026c4eb594ad96fac2bfe5f8ffebb9c841c353920b7b8ec11abc0100d90778da8d563b8f1c4510eedbf7e37cf209d9e60808402496c0dcdaac4e8ece01090112afe83043ef74ed4e6b677a86ee9edd5b3b2121b049888d842c84c0c1456702eb20b036424242c2e00408800c24fe03d53db3f33a58e860b6bbeaebeaeaaaafaab7f55bff9d1a796df0e5798263c37cc89f2fbe657e1eb8c7cb92e0de5f83c1eded95e4fded2d08150faf5ea5237e69f7855db2d3c199e351e5915a339c0b900d4103681849dff5c09daa3818bc34ec5057f319d54036b6c640752cc1617c024a17515d1a6b2f945c2f48a3ab3d09ca0b7dd68ab9d097078d292cd4267e9c39f089a70faea351378c85563b11c8802bf44c383eccc0cf20cd39e55a9d31df4c766ee487eed4f528174e4425baab412ab2fd44400f1dab73046827567402f6ece195a73495139455b44ee4ead4bb1db3594b2a94b929fa51367179f0f4882adc00722dea6c6edb0798d3452a7fd60d858643ed8c2598c8297bf18227220efe2f948148a1851bbb515c72a47ce34cbbeec655133b0106781de0c9aa059f8f41f3200b19833148090c41870e1c465c528b9b73c1c2798a3a57b5c2c0cfe276de28b9f0b90027552b7e6375c085d35a0691f6ac7a7768c39351b2a4eabb54b8e0dba3486d2b597131b1f0b3553ab68cff9c15a9dec3adc83b0327b5764a645b3bbd7c77b2ce294f6a755cf4a278e473d7c1692b91a74e75d083a9b5d828596cb8218364a6175132eb4b782fe61202581d2b906ec926dcee4a2cd2302de6ec9354785ea52d5bd5900bda21ea652849adab4030243b676debdc60af83126d32d91c2d34a85341c20682e6d233ab41b8f02f154e6a05e4e9b897c2b319c990c52e3a859123b533d932bbdf76c276c527c2e4b21ceb4d8cd8aa8bb1b56dac6d90260d1b8db10c036bbaa54063abace4ba8ea2241c3da3f77980ddaa92bd2e7628c7629ab617f54c2527174b05a6ae8a8236da3229af186acd0293fea689c65e7716ccb0eb61a892b5e548eeca2475a55ec7d3d32658c78357533c329d62a2b5eda28a6cb492c93f3758e35524f9ac128236578e11276e742c286468aca330a42cf661ab98b783ebbd58643cafff27cf7b71c4685a678db575669c5f1543c3e0735af70bef07a975ec4a819b769132cbcc6379f1637c36f3278f7c7debe2cb1f7c7eadd434c8feb73fdd3bfaf4956223c0f1fcb4fec587792193fd4fee3cc31edc2956278e5f1fdd7cfc59566c1fbd39fc19d8d14999a138ee42707492b171f5c0afa848c877af9e78c7cb22f570ec3f77fb789951c882be4940930cf4f0d1db6fdc5f16528fe3ddaf0eee2fb324e3d8fb1e057942cd851ffef1fb8fc5fcd920f8af3f2e66c9fcffb84b7ff865b7ce875708c9ff60d8f137aa5a1fa900d00700001001010020742877c36a520b152b1337ea1ecd37b0c98ad07289c32fec392e7eebab9f0ac71f7bc8c718cfa75317b2e15702372a9222c4616783ee7b3f0ec6358f8c328eea00005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232201a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b72410000d00700001001010020058e23368b919493d6ac61d27f66b829a53893e88ddde857d3b82d913960960d22fa36f397752b98c295e3b31927f740127c0a99e76f8bfeea88f44466b8fbfd00005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea990000d0070000100101001f43fe868e263d8134cf705aa85e26ce78ebb058edd558865fa3d240f5cb9e50c2389e9c8276eac800b7233a552045b2e79124c97e5156a0649849cc7f5d09eee600005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232204a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0f0000d0070000100101001f29e82b08ccf15e2187f29fea11ee3f4974f41b51e45b19f353348d8848b86fb71cadd88630456b7a1c60803c7b402487d41fbf18f0b0a13b4cca1f740447938300005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220e0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff5260000d0070000100101002047a8b784c3765b5c63ac52e3d8461b80bc2d3e3f62434f8accb277d9f2487cfd3c0728fcd26b5119a11288e5db46bc5b547877e220971609d1cef8cba443340800005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed32322068dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a2974280000d007000010010100203e701fbafd4149bc95b55a6bfc3b78246f5c2668ccc05ed4059a36ceb38f140b31e3b69e15f2579571e5bde39e034947271599c200e540b3949112bef163074c00005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c430000d0070000100101001f0cc7352e60f4f8476783d6d1b48766a111c56fee2c1a552e76a75c92bc17de172f994ffc854c09717c904054819ca7a17379ddecaf531c439b35337ba099b81300005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232208ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a4050000d0070000100101002040965063a83be2d53b36c8d7e0775f503c2caa1407e586314562aace52c272fe60659e196413a6c9db4168470bcabb9a5851121c10c7b665f363f6cd4d1e4bda00005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232202652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed250000d0070000100101002074ea7468b2a031c4cd53bf10ec3ac66b0c4b5c8779e045f1ef8d9c7b116be649217ff340107d0163397b99918ee2ce822b66cd6fce7b385af97a04671136e2ee00005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d0000d007000010010100204dfb21ca5140582379bc026792c16b4cf97827143a4a9cd99ae70b3e6016cd6316bcbb9f1cb1233f12a0bbcd9debafa64724d0459b5c8d3cb67ceddfb2e3962500005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232204e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d670000d0070000100101002033446a3a94ade71dff3edb786259679487ab701bbc147490b1d4159fecf545fa22fee0698db16bf616465e5cebb985bfc4d9ed1ec4a55e38997dd4b4bbc427eb00005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232204fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c20000d0070000100101001f3f67edd35bf731a07f40c638e8812112cd7d1baa39ec7dac4a1b2f0c83ac8bd53689b56dba69a7386e3860a6f8976695ac0bc2b5dacae91080f1d54df2dac0c000005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b44767070000d0070000100101001f1e030564013603d54f9e983b63cd940f8ff09ae038b14813f4021bb0c09ebb640d90cb4f8d57be2809f492a51737b671a5f549d4efa8e7efdaeaa9663c09d1ad00005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead450710000d007000010010100205cea642eecf05568ce8c5564e63349eea3b816108914ba2ab5efffbb8ea467265f0b6d474f03ed02a3bf529fd6e55a595cbf8dd1adf4311cb9c51e862f8a535400005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232205443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b40000d0070000100101001f4556076cc86e0840bf69664f1ef8fcd4d91abda313d08e7840d24ba45cb429cf12b7d3a1f64250c19d1b975e7b107853beff70ebfc4c27c44f825dc05cdc9cd600005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e990000d0070000100101001f354d903ad0f2c6cc9d9a377d681ffaa00475d1e559e48074b4c8cce3111d5c172903b2f179ad4d736dda4e7d1b6a859baeab9dde5e5e495ce09733ec4650634400005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb400000d0070000100101001f1766fa716a828da244c9ce52919b7a19acb38dbd110d1bb0039bb2477c17e4465dceecb8330ed5ee9de1330930dfcfa1a5e8149ce8536a82c0093642adf7328200005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232206bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc0000d00700001001010020488923db1c78fa430a3a9eab75f4ee467c7b9a3d3b4eb3bd08e183c82ef79b9102a4d2a7d1ec79c96b404911ae1b10f579bd82a660011c1ca2b872b30ef7dcac00005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed32322035c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b0000d0070000100101001f61ee60b366c2f3623012648000835e6089f9e9594a113acad200ae8a87bd05274acede23160e2e187d9921ea2ff6f37e3bd10ffd624ffceb511455c42f1c9ee200005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed32322063320dd4a58212e4d32d1f58926b73ca33a247326c2a5e9fd39268d2384e011a0000d0070000100101001f184aad2b65730f7485957642fa1688c66e8ece7827ee2e8e01f8bc904cedd8ec5462c12a1e3c6cd41f4a15a350ec8575bb05e9597f4316ff73a4e1066aeab3d500005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220fce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb40000d0070000100101002041c996b52c4bdbbc4fbdaf707dd01e74c46c51ce2c8e10e174e12502cb6be3f23e2d44e8e8802e970bc5ccfc4d056e400c92a56667183c37e0f79fbe77540a0000005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed32322009e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc16000001 DMLOG START_BLOCK 4 DMLOG FEATURE_OP ACTIVATE 1a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b7241 {"feature_digest":"1a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b7241","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"f3c3d91c4603cde2397268bfed4e662465293aab10cd9416db0d442b8cec2949","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"ONLY_LINK_TO_EXISTING_PERMISSION"}]} DMLOG FEATURE_OP ACTIVATE ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea99 {"feature_digest":"ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea99","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"9908b3f8413c8474ab2a6be149d3f4f6d0421d37886033f27d4759c47a26d944","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"REPLACE_DEFERRED"}]} @@ -153,43 +153,43 @@ DMLOG FEATURE_OP ACTIVATE bcd2a26394b36614fd4894241d3c451ab0f6fd110958c342307362 DMLOG FEATURE_OP ACTIVATE d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb40 {"feature_digest":"d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb40","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"8139e99247b87f18ef7eae99f07f00ea3adf39ed53f4d2da3f44e6aa0bfd7c62","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"CONFIGURABLE_WASM_LIMITS2"}]} DMLOG FEATURE_OP ACTIVATE 6bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc {"feature_digest":"6bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"68d6405cb8df3de95bd834ebb408196578500a9f818ff62ccc68f60b932f7d82","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"CRYPTO_PRIMITIVES"}]} DMLOG FEATURE_OP ACTIVATE 35c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b {"feature_digest":"35c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"e5d7992006e628a38c5e6c28dd55ff5e57ea682079bf41fef9b3cced0f46b491","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"GET_BLOCK_NUM"}]} -DMLOG FEATURE_OP ACTIVATE 98c4175db53ed27e7911a1b5adf0e7db0fc96c2cae172cf594dfa9a742ca9e88 {"feature_digest":"98c4175db53ed27e7911a1b5adf0e7db0fc96c2cae172cf594dfa9a742ca9e88","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"01969c44de35999b924095ae7f50081a7f274409fdbccb9fc54fa7836c76089c","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"BLS_PRIMITIVES"}]} +DMLOG FEATURE_OP ACTIVATE 63320dd4a58212e4d32d1f58926b73ca33a247326c2a5e9fd39268d2384e011a {"feature_digest":"63320dd4a58212e4d32d1f58926b73ca33a247326c2a5e9fd39268d2384e011a","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"c0cce5bcd8ea19a28d9e12eafda65ebe6d0e0177e280d4f20c7ad66dcd9e011b","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"BLS_PRIMITIVES2"}]} DMLOG FEATURE_OP ACTIVATE fce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb4 {"feature_digest":"fce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb4","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"440c3efaaab212c387ce967c574dc813851cf8332d041beb418dfaf55facd5a9","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"DISABLE_DEFERRED_TRXS_STAGE_1"}]} DMLOG FEATURE_OP ACTIVATE 09e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc16 {"feature_digest":"09e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc16","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"a857eeb932774c511a40efb30346ec01bfb7796916b54c3c69fe7e5fb70d5cba","dependencies":["fce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb4"],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"DISABLE_DEFERRED_TRXS_STAGE_2"}]} DMLOG CREATION_OP ROOT 0 DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304003,"value_ex":56858,"consumed":1},"cpu_usage":{"last_ordinal":1262304003,"value_ex":267959,"consumed":101},"ram_usage":180802} -DMLOG TRX_OP CREATE onblock c405e4100ac393946c349cb7559410f66dcc13401a3c4b78bd2a45d1c2585a9c 0000000000000000000000000000010000000000ea305500000000221acfa4010000000000ea305500000000a8ed323274023b3d4b0000000000ea305500000000000213588be25132b4167ced6df22b5439e376d5a20284190bb94a43e3e8026d1e183a540eea430e5cbad5bc491bddec73f7eec3e61d3f16dfcbc7bdc894a93b2e0bb30fa9132d61c575656be9a25e72e1825d1ccfedd30477c6c0e70409000000000000000000 -DMLOG APPLIED_TRANSACTION 4 c405e4100ac393946c349cb7559410f66dcc13401a3c4b78bd2a45d1c2585a9c04000000033b3d4b01000000040fe1293299472996f03cf30560d9279afc23397ac2c9e2bd8ebf9daa01006400000000000000000000000000000000000000000001010000010000000000ea305561be9792ad8e467f9ea85d2e2bc8f79826b5988e519ba00e4b90653e7f5d5e8b1a000000000000001a00000000000000010000000000ea30551a0000000000000001010000000000ea30550000000000ea305500000000221acfa4010000000000ea305500000000a8ed323274023b3d4b0000000000ea305500000000000213588be25132b4167ced6df22b5439e376d5a20284190bb94a43e3e8026d1e183a540eea430e5cbad5bc491bddec73f7eec3e61d3f16dfcbc7bdc894a93b2e0bb30fa9132d61c575656be9a25e72e1825d1ccfedd30477c6c0e7040900000000000000000000000000000000c405e4100ac393946c349cb7559410f66dcc13401a3c4b78bd2a45d1c2585a9c04000000033b3d4b01000000040fe1293299472996f03cf30560d9279afc23397ac2c9e2bd8ebf9daa0000000000000000 +DMLOG TRX_OP CREATE onblock 1b966cce9b736607ae395e8c0ff4bd21c4ce3566b2ddc1883ce69dbc28883666 0000000000000000000000000000010000000000ea305500000000221acfa4010000000000ea305500000000a8ed323274023b3d4b0000000000ea305500000000000213588be25132b4167ced6df22b5439e376d5a20284190bb94a43e3e82f7d596eef522faabf96b279df52ed6aca4107c87b6d789038d6f3ab4cce7311075993067e6f396bd6073f497bfeb8da8ad7850ab7a28e75602a6ca92df12a2a000000000000000000 +DMLOG APPLIED_TRANSACTION 4 1b966cce9b736607ae395e8c0ff4bd21c4ce3566b2ddc1883ce69dbc2888366604000000033b3d4b0100000004119dde5dc2ba60b1c4f1013a50ea81abfa00d53b1c9bd42d37f5a79e01006400000000000000000000000000000000000000000001010000010000000000ea3055f332f7b7263781f123b5e98b21d4a1684f7ba6a93f8b592b59be063b98f2e4dd1a000000000000001a00000000000000010000000000ea30551a0000000000000001010000000000ea30550000000000ea305500000000221acfa4010000000000ea305500000000a8ed323274023b3d4b0000000000ea305500000000000213588be25132b4167ced6df22b5439e376d5a20284190bb94a43e3e82f7d596eef522faabf96b279df52ed6aca4107c87b6d789038d6f3ab4cce7311075993067e6f396bd6073f497bfeb8da8ad7850ab7a28e75602a6ca92df12a2a000000000000000000000000000000001b966cce9b736607ae395e8c0ff4bd21c4ce3566b2ddc1883ce69dbc2888366604000000033b3d4b0100000004119dde5dc2ba60b1c4f1013a50ea81abfa00d53b1c9bd42d37f5a79e0000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG RAM_OP 0 eosio code update setcode eosio 199492 18690 DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304003,"value_ex":96673,"consumed":6881},"cpu_usage":{"last_ordinal":1262304003,"value_ex":279534,"consumed":2101},"ram_usage":199492} -DMLOG APPLIED_TRANSACTION 4 33b8da17f14fd29bc3816c633afb522ccb52b71e33f3474f9b3b46b38d9fdcbc04000000033b3d4b01000000040fe1293299472996f03cf30560d9279afc23397ac2c9e2bd8ebf9daa0100d0070000dc060000000000000000e01a0000000000000001010000010000000000ea3055378d583c2888f3564b4db37bfb52d74d038e54fcc63aeb57cf27b03c001e97a51b000000000000001b00000000000000010000000000ea30551b0000000000000002010000000000ea30550000000000ea305500000040258ab2c2010000000000ea305500000000a8ed3232cb99010000000000ea30550000be99010061736d010000000198011960000060027f7f0060037f7f7f0060047e7e7e7e017f6000017e60047f7e7e7f0060057f7f7f7f7f017f60037f7f7f017f60027f7f017f60027f7f017e60057f7f7f7f7f0060067e7e7e7e7f7f017f60017e0060027e7f0060047e7e7e7e0060037e7f7f017e60017f0060017f017f6000017f60027f7e0060047f7e7f7f0060037e7e7e0060037f7e7f0060047f7f7f7f0060027e7e0002f0052403656e760b64625f66696e645f693634000303656e760c656f73696f5f617373657274000103656e761063757272656e745f7265636569766572000403656e760561626f7274000003656e760d6173736572745f736861323536000203656e760b6173736572745f73686131000203656e760d6173736572745f736861353132000203656e76106173736572745f726970656d64313630000203656e7606736861323536000203656e76095f5f6173686c746933000503656e760473686131000203656e7606736861353132000203656e7609726970656d64313630000203656e760b7265636f7665725f6b6579000603656e76207365745f626c6f636b636861696e5f706172616d65746572735f7061636b6564000103656e76066d656d637079000703656e76206765745f626c6f636b636861696e5f706172616d65746572735f7061636b6564000803656e76167365745f70726f706f7365645f70726f647563657273000903656e760c63757272656e745f74696d65000403656e76146765745f6163746976655f70726f647563657273000803656e76087072696e74735f6c000103656e76126173736572745f7265636f7665725f6b6579000a03656e760c64625f73746f72655f693634000b03656e760c726571756972655f61757468000c03656e760e7365745f70726976696c65676564000d03656e76137365745f7265736f757263655f6c696d697473000e03656e76197365745f70726f706f7365645f70726f6475636572735f6578000f03656e761370726561637469766174655f66656174757265001003656e76067072696e7473001003656e761469735f666561747572655f616374697661746564001103656e7610616374696f6e5f646174615f73697a65001203656e7610726561645f616374696f6e5f64617461000803656e7611656f73696f5f6173736572745f636f6465001303656e760a64625f6765745f693634000703656e760d64625f7570646174655f693634001403656e76087072696e7468657800010346450015111000111010100c100802101608020817010110011818181818181808011818181818080101180818181808000808010101080101010801010102080108020202020804050170010d0d05030100010616037f014180c0000b7f0041e2c5000b7f0041e2c5000b070901056170706c7900250912010041010b0c555657595a5b5d5e5f6465660aab8b0145040010280bdd03002000102d102420002001510440428080f9d4a98499dc9a7f200251044020002001103b05428080add68d959ba955200251044020002001103c05428080add68d95abd1ca00200251044020002001103d0542808080e8b2edc0d38b7f200251044020002001103e05428080add68db8baf154200251044020002001103f054280f8a6d4d2a8a1d3c1002002510440200020011040054280808080d4c4a2d942200251044020002001104105428080808080f798d9422002510440200020011044054280808080aefadeeaa47f2002510440200020011045054280808080b6f7d6d942200251044020002001104605428080b8f6a4979ad94220025104402000200110470542808080c093fad6d9422002510440200020011048054280808096cdebd4d942200251044020002001104c054280808080daac9bd6ba7f200251044020002001104e0542808080d0b2b3bb9932200251044020002001104f054290a9d9d9dd8c99d6ba7f2002510440200020011050052000428080808080c0ba98d500520440410042808080d9d3b3ed82ef0010200b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b05428080808080c0ba98d50020015104404280808080aefadeeaa47f2002510440410042818080d9d3b3ed82ef0010200b0b0b410010310b7201037f024020000d0041000f0b4100410028028c40200041107622016a220236028c404100410028028440220320006a410f6a4170712200360284400240200241107420004b0d004100200241016a36028c40200141016a21010b024020014000417f470d0041004190c00010010b20030b02000b3601017f230041106b2200410036020c4100200028020c280200410f6a417071220036028040410020003602844041003f0036028c400b3301027f2000410120001b2101024003402001102622000d01410021004100280284412202450d0120021100000c000b0b20000b0600200010270b05001003000b05001003000b0a0041002000370388410b4e01017f230041e0006b220124002001200141d8006a3602082001200141106a3602042001200141106a36020020012000102f1a200141106a200128020420012802006b100e200141e0006a24000ba20801027f02402000280208200028020422026b41074a0d0041004190c1001001200028020421020b200220014108100f1a2000200028020441086a2202360204200141086a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a22023602042001410c6a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141106a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141146a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141186a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a22023602042001411c6a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141206a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141246a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141286a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a22023602042001412c6a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141306a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141346a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141386a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a22023602042001413c6a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141c0006a21030240200028020820026b41014a0d0041004190c1001001200028020421020b200220034102100f1a2000200028020441026a2202360204200141c2006a21010240200028020820026b41014a0d0041004190c1001001200028020421020b200220014102100f1a2000200028020441026a36020420000bfa0103017f027e017f230041306b2203240020012002200341106a1008420021044110210141002102420021050340200341106a20026a21060240024020014102490d002005420886200420063100008422044238888421052001417f6a2101200442088621040c010b024020014101460d00410041a9c00010010b200020053703082000200420063100008437030041102101200041106a210042002104420021050b200241016a22024120470d000b024020014110460d00024020014102490d00200320042005200141037441786a1009200341086a2903002105200329030021040b20002004370300200020053703080b200341306a24000b02000b970503017f017e047f230041f0006b22032400200341206a4100360200200342003703182003427f37031020032000290300220437030820032004370300024002402004200442808080809aecb4ee312001100022004100480d00024020032000103322002802302003460d00410041c0c20010010b2003200236023020032000200341306a10340c010b024020041002510d004100418ac30010010b41c000102922004200370310200041286a22054200370300200041206a22064200370300200041186a220742003703002000200336023020002001370300200341306a20022802002208200228020420086b10302005200341306a41186a2903003703002006200341306a41106a29030037030020072003290338370300200020032903303703102003200341306a41286a3602682003200341306a360260200341306a20004108100f1a2003200341306a410872360264200341e0006a200041106a10351a2000200329030842808080809aecb4ee31200120002903002204200341306a412810162205360234024020042003290310540d002003427e200442017c2004427d561b3703100b200320003602602003200029030022043703302003200536022c02400240200328021c220220032802204f0d00200220053602102002200437030820034100360260200220003602002003200241186a36021c0c010b200341186a200341e0006a200341306a2003412c6a10360b20032802602100200341003602602000450d002000102a0b024020032802182205450d0002400240200328021c22002005470d00200521000c010b0340200041686a220028020021022000410036020002402002450d002002102a0b20052000470d000b200328021821000b2003200536021c2000102a0b200341f0006a24000b840603097f027e017f230041e0006b220221032002240002400240200028021822042000411c6a2802002205460d0002400340200541786a2802002001460d012004200541686a2205470d000c020b0b20042005460d00200541686a28020021060c010b024002400240024020014100410010212205417f4a0d00410041f3c20010010c010b2005418104490d010b200510262107410121080c010b20022005410f6a4170716b22072400410021080b20012007200510211a41c0001029220642003703102006420037030020062000360230200641186a4200370300200641206a4200370300200641286a42003703000240200541074b0d00410041d9c40010010b200620074108100f1a200741086a21040240200541786a411f4b0d00410041d9c40010010b200041186a2109200641106a210a200341c0006a20044120100f1a4200210b41102105200341206a2102410021044200210c0340200341c0006a20046a210d0240024020054102490d00200c420886200b200d31000084220b42388884210c2005417f6a2105200b420886210b0c010b024020054101460d00410041b6c50010010b2002200c3703082002200b200d3100008437030041102105200241106a21024200210b4200210c0b200441016a22044120470d000b024020054110460d00024020054102490d00200341086a200b200c200541037441786a1009200341106a290300210c2003290308210b0b2002200b3703002002200c3703080b200a2003290320370300200a41086a2003290328370300200a41186a200341206a41186a290300370300200a41106a200341206a41106a290300370300200620013602342003200636022020032006290300220b3703402003200136021c02400240200028021c2205200041206a2802004f0d00200520013602102005200b37030820034100360220200520063602002000200541186a36021c0c010b2009200341206a200341c0006a2003411c6a10360b02402008450d00200710270b20032802202105200341003602202005450d002005102a0b200341e0006a240020060b980203027f017e017f230041206b2203210420032400024020012802302000460d00410041bdc30010010b024010022000290300510d00410041ebc30010010b200129030021052004200228020022022802002206200228020420066b1030200141286a200441186a290300370300200141206a200441106a290300370300200141186a200429030837030020012004290300370310200141106a2102024020052001290300510d004100419ec40010010b200341506a220324002004200341286a36020820042003360200200320014108100f1a2004200341086a3602042004200210351a20012802344200200341281022024020052000290310540d002000427e200542017c2005427d561b3703100b200441206a24000bd20303017f027e017f230041206b220224002002200141186a29030022033c00172002200141086a29030022044220883c0003200220044228883c0002200220044230883c0001200220044238883c0000200220034220883c001320022003a722054108763a0016200220054110763a0015200220054118763a001420022004a722053a0007200220054108763a0006200220054110763a0005200220054118763a0004200220012903002204423886200442288642808080808080c0ff0083842004421886428080808080e03f8320044208864280808080f01f838484200442088842808080f80f832004421888428080fc07838420044228884280fe03832004423888848484370308200220012903102204423886200442288642808080808080c0ff0083842004421886428080808080e03f8320044208864280808080f01f838484200442088842808080f80f832004421888428080fc07838420044228884280fe03832004423888848484370318200220034230883c0011200220034228883c0012200220034238883c001002402000280208200028020422016b411f4a0d0041004188c2001001200028020421010b200120024120100f1a2000200028020441206a360204200241206a240020000b9a0301057f0240024002402000280204200028020022046b41186d220541016a220641abd5aad5004f0d0041aad5aad500210702400240200028020820046b41186d220441d4aad52a4b0d0020062004410174220720072006491b22070d0041002107410021040c010b200741186c102921040b20012802002106200141003602002004200541186c22086a2201200328020036021020012002290300370308200120063602002004200741186c6a2105200141186a21062000280204220220002802002207460d01200420086a41686a21010340200241686a220428020021032004410036020020012003360200200141086a200241706a2202290300370300200141106a200241086a280200360200200141686a21012004210220072004470d000b200141186a210120002802042107200028020021040c020b2000102c000b200721040b200020053602082000200636020420002001360200024020072004460d000340200741686a220728020021012007410036020002402001450d002001102a0b20042007470d000b0b02402004450d002004102a0b0bd00203047f017e017f230041106b220224004100210320004100360208200042003702002002410036020020012802042204200128020022056b410575ad21060340200341016a2103200642078822064200520d000b2002200336020002400240024020052004460d0003402002200341086a3602002003410c6a2103200541186a2802002207ad21060340200341016a2103200642078822064200520d000b20022003417c6a3602002007417f460d022002200336020020022005410c6a10511a20022802002103200541206a22052004470d000b20002802002105200028020421070c020b41002105410021070c010b1052000b024002402003200720056b22074d0d002000200320076b1043200028020021050c010b200320074f0d002000200520036a3602040b2002200536020420022005360200200220002802043602082002200110531a200241106a24000baf0302017f027e230041206b22022400200029030010172002200141186a29030022033c00172002200141086a29030022044220883c0003200220044228883c0002200220044230883c0001200220044238883c0000200220034220883c001320022003a722004108763a0016200220004110763a0015200220004118763a001420022004a722003a0007200220004108763a0006200220004110763a0005200220004118763a0004200220012903002204423886200442288642808080808080c0ff0083842004421886428080808080e03f8320044208864280808080f01f838484200442088842808080f80f832004421888428080fc07838420044228884280fe03832004423888848484370308200220012903102204423886200442288642808080808080c0ff0083842004421886428080808080e03f8320044208864280808080f01f838484200442088842808080f80f832004421888428080fc07838420044228884280fe03832004423888848484370318200220034230883c0011200220034228883c0012200220034238883c00102002101b41bdc100101c2001103941bbc100101c200241206a24000b9c0303017f027e017f230041206b220124002001200041186a29030022023c00172001200041086a29030022034220883c0003200120034228883c0002200120034230883c0001200120034238883c0000200120024220883c001320012002a722044108763a0016200120044110763a0015200120044118763a001420012003a722043a0007200120044108763a0006200120044110763a0005200120044118763a0004200120002903002203423886200342288642808080808080c0ff0083842003421886428080808080e03f8320034208864280808080f01f838484200342088842808080f80f832003421888428080fc07838420034228884280fe03832003423888848484370308200120002903102203423886200342288642808080808080c0ff0083842003421886428080808080e03f8320034208864280808080f01f838484200342088842808080f80f832003421888428080fc07838420034228884280fe03832003423888848484370318200120024230883c0011200120024228883c0012200120024238883c0010200141201023200141206a24000ba70303017f027e017f230041206b220224002002200141186a29030022033c00172002200141086a29030022044220883c0003200220044228883c0002200220044230883c0001200220044238883c0000200220034220883c001320022003a722054108763a0016200220054110763a0015200220054118763a001420022004a722053a0007200220054108763a0006200220054110763a0005200220054118763a0004200220012903002204423886200442288642808080808080c0ff0083842004421886428080808080e03f8320044208864280808080f01f838484200442088842808080f80f832004421888428080fc07838420044228884280fe03832004423888848484370308200220012903102204423886200442288642808080808080c0ff0083842004421886428080808080e03f8320044208864280808080f01f838484200442088842808080f80f832004421888428080fc07838420044228884280fe03832004423888848484370318200220034230883c0011200220034228883c0012200220034238883c001002402002101d0d00410041d8c10010010b200241206a24000bb90101047f230041106b2202210320022400024002400240101e22040d002003420037030841002102200341086a21050c010b024002402004418004490d002004102621020c010b20022004410f6a4170716b220224000b20022004101f1a20034200370308200341086a2105200441074b0d010b410041d9c40010010b200520024108100f1a20034200370300200241086a2102024020044178714108470d00410041d9c40010010b200320024108100f1a200341106a24000b4401037f2300220221030240101e2204450d00024002402004418004490d002004102621020c010b20022004410f6a4170716b220224000b20022004101f1a0b200324000b4401037f2300220221030240101e2204450d00024002402004418004490d002004102621020c010b20022004410f6a4170716b220224000b20022004101f1a0b200324000b4401037f2300220221030240101e2204450d00024002402004418004490d002004102621020c010b20022004410f6a4170716b220224000b20022004101f1a0b200324000b4401037f2300220221030240101e2204450d00024002402004418004490d002004102621020c010b20022004410f6a4170716b220224000b20022004101f1a0b200324000b4401037f2300220221030240101e2204450d00024002402004418004490d002004102621020c010b20022004410f6a4170716b220224000b20022004101f1a0b200324000bc90201047f230041306b220221032002240002400240101e22040d00410021020c010b024002402004418004490d002004102621020c010b20022004410f6a4170716b220224000b20022004101f1a0b20032002360224200320023602202003200220046a2205360228200342003703180240200441074b0d00410041d9c400100120032802282105200328022421020b200341186a20024108100f1a2003200241086a2202360224024020052002470d00410041d9c400100120032802282105200328022421020b200341176a20024101100f1a2003200241016a2202360224024020052002470d00410041d9c4001001200328022421020b200341166a20024101100f1a2003200241016a3602242003410036021020034200370308200341206a200341086a10421a024020032802082202450d002003200236020c2002102a0b200341306a24000bff0103017f017e047f2000280204210242002103410021040340024020022000280208490d0041004183c5001001200028020421020b20022d000021052000200241016a22063602042003200541ff0071200441ff0171220274ad842103200241076a2104200621022005418001710d000b0240024020012802042205200128020022026b22072003a722044f0d002001200420076b10432000280204210620012802042105200128020021020c010b200720044d0d002001200220046a22053602040b0240200028020820066b200520026b22054f0d00410041d9c4001001200028020421060b200220062005100f1a2000200028020420056a36020420000b980201057f02400240024020002802082202200028020422036b2001490d000340200341003a00002000200028020441016a22033602042001417f6a22010d000c020b0b2003200028020022046b220520016a2206417f4c0d0141ffffffff07210302400240200220046b220241feffffff034b0d0020062002410174220320032006491b22030d0041002103410021020c010b2003102921020b200220036a2106200220056a220421030340200341003a0000200341016a21032001417f6a22010d000b20042000280204200028020022016b22026b2104024020024101480d00200420012002100f1a200028020021010b2000200636020820002003360204200020043602002001450d002001102a0b0f0b2000102c000bb20202037f017e23004180016b220221032002240002400240101e22040d00410021020c010b024002402004418004490d002004102621020c010b20022004410f6a4170716b220224000b20022004101f1a0b20032002360254200320023602502003200220046a360258200342003703480240200441074b0d00410041d9c4001001200328025421020b200341c8006a20024108100f1a2003200241086a3602542003410036024020034200370338200341d0006a200341386a10421a200341086a41086a200341d0006a41086a2802002202360200200341306a2002360200200320032903502205370308200320013703202003200037031820032005370328200341186a2003290348200341386a1032024020032802382202450d002003200236023c2002102a0b20034180016a24000b4c01037f2300220221030240101e2204450d00024002402004418004490d002004102621020c010b20022004410f6a4170716b220224000b20022004101f1a0b410041d5c0001001200324000bcf0102047f017e230041106b2202210320022400024002400240101e22040d002003420037030841002102200341086a21050c010b024002402004418004490d002004102621020c010b20022004410f6a4170716b220224000b20022004101f1a20034200370308200341086a2105200441074b0d010b410041d9c40010010b200520024108100f1a200241086a2102024020044108470d00410041d9c40010010b200341076a20024101100f1a2003290308210620032d0007210420001017200620044100471018200341106a24000baa0202047f047e230041206b2202210320022400024002400240101e22040d002003420037031841002102200341186a21050c010b024002402004418004490d002004102621020c010b20022004410f6a4170716b220224000b20022004101f1a20034200370318200341186a2105200441074b0d010b410041d9c40010010b200520024108100f1a200241086a21050240200441787122044108470d00410041d9c40010010b200341106a20054108100f1a200241106a2105024020044110470d00410041d9c40010010b200341086a20054108100f1a200241186a2102024020044118470d00410041d9c40010010b200320024108100f1a200329030021062003290308210720032903102108200329031821092000101720092008200720061019200341206a24000ba103010b7f230041306b2202210320022400410021040240101e2205450d00024002402005418004490d002005102621040c010b20022005410f6a4170716b220424000b20042005101f1a0b20032004360214200320043602102003200420056a3602182003410036020820034200370300200341106a200310491a20001017200341206a20031037420120032802202204200328022420046b101a1a024020032802202204450d00200320043602242004102a0b024020032802002206450d0002400240200328020422072006470d00200621040c010b03402007220441606a21070240200441786a2208280200417f460d002004416c6a2209280200220a450d00200a21050240200441706a220b2802002204200a460d000340200441486a21050240200441786a2202280200220c417f460d00200341206a200441486a200c4102744188c5006a2802001101000b2002417f36020020052104200a2005470d000b200928020021050b200b200a3602002005102a0b2008417f36020020072006470d000b200328020021040b200320063602042004102a0b200341306a24000bcc0303027f017e097f230041206b220224002000280204210342002104410021050340024020032000280208490d0041004183c5001001200028020421030b20032d000021062000200341016a22033602042004200641ff0071200541ff0171220574ad842104200541076a2105200321032006418001710d000b0240024020012802042207200128020022056b41057522062004a722034f0d002001200320066b104a200128020421070c010b200620034d0d000240200520034105746a22082007460d0003402007220341606a21070240200341786a2209280200417f460d002003416c6a220a280200220b450d00200b21060240200341706a220c2802002203200b460d000340200341486a21060240200341786a2205280200220d417f460d00200241186a200341486a200d4102744188c5006a2802001101000b2005417f36020020062103200b2006470d000b200a28020021060b200c200b3602002006102a0b2009417f36020020072008470d000b0b20012008360204200821070b0240200128020022032007460d00034020022000360208200220033602102002200341086a360214200241106a200241086a104b200341206a22032007470d000b0b200241206a240020000b9f06030a7f017e037f230041106b220224000240024020002802082203200028020422046b4105752001490d000340200441186a2203420037030020044200370300200441106a4200370300200441086a4200370300200341003602002000200028020441206a22043602042001417f6a22010d000c020b0b02400240024002402004200028020022056b410575220620016a220741808080c0004f0d0041ffffff3f210402400240200320056b220341057541feffff1f4b0d00024020072003410475220420042007491b22040d0041002104410021030c020b200441808080c0004f0d030b2004410574102921030b200320044105746a2108200320064105746a22092104034020044200370300200441186a4200370300200441106a4200370300200441086a4200370300200441206a21042001417f6a22010d000b2000280204220a20002802002206460d022006200a6b210b410021050340200920056a220141786a2206417f360200200a20056a220341606a290300210c200141686a220741003a0000200141606a200c3703000240200341786a280200220d417f460d00200141706a220e42003702002001416c6a220f4100360200200e200341706a280200360200200f2003416c6a220e280200360200200141746a200341746a22012802003602002007200341686a2802003602002006200d36020020014100360200200e42003702000b200b200541606a2205470d000b200920056a2109200028020421062000280200210d0c030b2000102c000b1003000b2006210d0b20002008360208200020043602042000200936020002402006200d460d0003402006220441606a21060240200441786a2207280200417f460d002004416c6a220e2802002200450d00200021010240200441706a220f28020022042000460d000340200441486a21010240200441786a22032802002205417f460d00200241086a200441486a20054102744188c5006a2802001101000b2003417f3602002001210420002001470d000b200e28020021010b200f20003602002001102a0b2007417f3602002006200d470d000b0b200d450d00200d102a0b200241106a24000bca0102037f017e20002802002102024020012802002203280208200328020422046b41074b0d00410041d9c4001001200328020421040b200220044108100f1a2003200328020441086a3602042000280204210220012802002201280204210342002105410021040340024020032001280208490d0041004183c5001001200128020421030b20032d000021002001200341016a22033602042005200041ff0071200441ff0171220474ad842105200441076a2104200321032000418001710d000b200120022005a710600b890101037f230041e0006b220221032002240002400240101e22040d00410021020c010b024002402004418004490d002004102621020c010b20022004410f6a4170716b220224000b20022004101f1a0b20032002360254200320023602502003200220046a360258200341d0006a200341086a104d1a20001017200341086a102e200341e0006a24000ba20801027f02402000280208200028020422026b41074b0d00410041d9c4001001200028020421020b200120024108100f1a2000200028020441086a2202360204200141086a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a22023602042001410c6a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141106a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141146a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141186a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a22023602042001411c6a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141206a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141246a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141286a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a22023602042001412c6a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141306a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141346a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141386a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a22023602042001413c6a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141c0006a21030240200028020820026b41014b0d00410041d9c4001001200028020421020b200320024102100f1a2000200028020441026a2202360204200141c2006a21010240200028020820026b41014b0d00410041d9c4001001200028020421020b200120024102100f1a2000200028020441026a36020420000b940101047f230041106b2202210320022400024002400240101e22040d002003420037030841002102200341086a21050c010b024002402004418004490d002004102621020c010b20022004410f6a4170716b220224000b20022004101f1a20034200370308200341086a2105200441074b0d010b410041d9c40010010b200520024108100f1a20032903081017200341106a24000b8c0405047f017e037f017e017f230041f0006b220221032002240002400240101e22040d00410021050c010b024002402004418004490d002004102621050c010b20022004410f6a4170716b220524000b20052004101f1a0b42002106200341286a420037030041102102200341106a41106a4200370300200342003703182003420037031002402004411f4b0d00410041d9c40010010b200520046a2107200341d0006a20054120100f1a200541206a2108200341306a2109410021044200210a0340200341d0006a20046a210b0240024020024102490d00200a4208862006200b31000084220642388884210a2002417f6a2102200642088621060c010b024020024101460d00410041b6c50010010b2009200a37030820092006200b3100008437030041102102200941106a2109420021064200210a0b200441016a22044120470d000b024020024110460d00024020024102490d0020032006200a200241037441786a1009200341086a290300210a200329030021060b200920063703002009200a3703080b200341106a41186a200341306a41186a290300370300200341106a41106a200341306a41106a2903003703002003200329033837031820032003290330370310200341d0006a41186a2007360200200341e4006a2008360200200320053602602003200137035820032000370350200341d0006a200341106a1038200341f0006a24000bc80303047f027e017f230041f0006b220221032002240002400240101e22040d00410021050c010b024002402004418004490d002004102621050c010b20022004410f6a4170716b220524000b20052004101f1a0b42002106200341286a420037030041102102200341106a41106a4200370300200342003703182003420037031002402004411f4b0d00410041d9c40010010b200341d0006a20054120100f1a200341306a210541002104420021070340200341d0006a20046a21080240024020024102490d002007420886200620083100008422064238888421072002417f6a2102200642088621060c010b024020024101460d00410041b6c50010010b200520073703082005200620083100008437030041102102200541106a210542002106420021070b200441016a22044120470d000b024020024110460d00024020024102490d00200320062007200241037441786a1009200341086a2903002107200329030021060b20052006370300200520073703080b200341106a41186a200341306a41186a290300370300200341106a41106a200341306a41106a29030037030020032003290338370318200320032903303703102002200341106a103a200341f0006a24000bd50103037f017e017f230041106b2202240020012802042203200128020022046b41386dad2105200028020021010340200141016a2101200542078822054200520d000b200020013602000240024020042003460d00034020042802302206ad21050340200141016a2101200542078822054200520d000b20002001360200200220003602002006417f460d0220022002360208200241086a2004200641027441fcc1006a2802001101002000200028020041026a2201360200200441386a22042003470d000b0b200241106a240020000f0b1052000b05001003000bfe0103017f017e037f230041106b22022400200128020420012802006b410575ad21032000280204210403402003a721052002200342078822034200522206410774200541ff0071723a000f0240200028020820046b41004a0d0041004188c2001001200028020421040b20042002410f6a4101100f1a2000200028020441016a220436020420060d000b02402001280200220520012802042206460d0003400240200028020820046b41074a0d0041004188c2001001200028020421040b200420054108100f1a2000200028020441086a3602042000200541086a10541a200541206a22052006460d01200028020421040c000b0b200241106a240020000bdd0103027f017e027f230041106b22022400200028020421032001350210210403402004a721052002200442078822044200522206410774200541ff0071723a000f0240200028020820036b41004a0d0041004188c2001001200028020421030b20032002410f6a4101100f1a2000200028020441016a220336020420060d000b02402001280210417f460d00200141046a21050240200028020820036b41034a0d0041004188c2001001200028020421030b200320014104100f1a2000200028020441046a3602042000200510581a200241106a240020000f0b1052000b170020002802002802002200200028020041216a3602000b170020002802002802002200200028020041216a3602000b7602017f017e20002802002802002202200228020041226a2200360200200141286a350200420020012d00244101711b21030340200041016a2100200342078822034200520d000b200220003602000240200128022820012d0024220141017620014101711b2201450d002002200120006a3602000b0b990303017f017e047f230041106b22022400200128020420012802006b41386dad21032000280204210403402003a721052002200342078822034200522206410774200541ff0071723a000f0240200028020820046b41004a0d0041004188c2001001200028020421040b20042002410f6a4101100f1a2000200028020441016a220436020420060d000b024002402001280200220720012802042201460d0003402007350230210303402003a721052002200342078822034200522206410774200541ff0071723a000e0240200028020820046b41004a0d0041004188c2001001200028020421040b20042002410e6a4101100f1a2000200028020441016a220436020420060d000b2002200036020020072802302204417f460d0220022002360208200241086a2007200441027441b4c2006a280200110100200741346a210502402000280208200028020422046b41014a0d0041004188c2001001200028020421040b200420054102100f1a2000200028020441026a2204360204200741386a22072001470d000b0b200241106a240020000f0b1052000b6401037f200028020028020022002802042102410021030340200120036a21040240200028020820026b41004a0d0041004188c2001001200028020421020b200220044101100f1a2000200028020441016a2202360204200341016a22034121470d000b0b6401037f200028020028020022002802042102410021030340200120036a21040240200028020820026b41004a0d0041004188c2001001200028020421020b200220044101100f1a2000200028020441016a2202360204200341016a22034121470d000b0baa0101037f200028020028020022002802042102410021030340200120036a21040240200028020820026b41004a0d0041004188c2001001200028020421020b200220044101100f1a2000200028020441016a2202360204200341016a22034121470d000b200141216a21030240200028020820026b41004a0d0041004188c2001001200028020421020b200220034101100f1a2000200028020441016a3602042000200141246a105c1a0bfd0103027f017e027f230041106b22022400200128020420012d0000220341017620034101711bad21042000280204210303402004a721052002200442078822044200522206410774200541ff0071723a000f0240200028020820036b41004a0d0041004188c2001001200028020421030b20032002410f6a4101100f1a2000200028020441016a220336020420060d000b0240200128020420012d00002205410176200541017122061b2205450d002001280208200141016a20061b21060240200028020820036b20054e0d0041004188c2001001200028020421030b200320062005100f1a2000200028020420056a3602040b200241106a240020000b02000b02000b1a00024020012d0024410171450d002001412c6a280200102a0b0bae0201047f230041206b220324000240024020020d00200341146a41003602002003420037020c200341086a410472210402402000280208200028020422026b41034b0d00410041d9c4001001200028020421020b200341086a20024104100f1a2000200028020441046a3602042000200410611a02402001280210417f460d0020012802042205450d00200521020240200141086a28020022002005460d000340200041486a21020240200041786a22042802002206417f460d00200341186a200041486a20064102744188c5006a2802001101000b2004417f3602002002210020052002470d000b200128020421020b200120053602082002102a0b2001200329030837020020014100360210200141086a20032903103702000c010b410041a0c50010010b200341206a24000b870303027f017e047f230041106b220224002000280204210342002104410021050340024020032000280208490d0041004183c5001001200028020421030b20032d000021062000200341016a22033602042004200641ff0071200541ff0171220574ad842104200541076a2105200321032006418001710d000b0240024020012802042205200128020022076b41386d22062004a722034f0d002001200320066b1062200128020421050c010b200620034d0d0002402007200341386c6a22082005460d000340200541486a21030240200541786a22062802002207417f460d00200241086a200541486a20074102744188c5006a2802001101000b2006417f3602002003210520082003470d000b0b20012008360204200821050b0240200128020022032005460d0003402000200310631a02402000280208200028020422066b41014b0d00410041d9c4001001200028020421060b200341346a20064102100f1a2000200028020441026a360204200341386a22032005470d000b0b200241106a240020000ba105010c7f230041106b2202240002400240024020002802082203200028020422046b41386d2001490d000340200441306a2203420037020020044200370200200441286a4200370200200441186a4200370200200441106a4200370200200441086a4200370200200441206a4200370200200341003602002000200028020441386a22043602042001417f6a22010d000c020b0b2004200028020022056b41386d220620016a220741a592c9244f0d0141a492c924210402400240200320056b41386d22034191c9a4124b0d0020072003410174220420042007491b22040d0041002104410021030c010b200441386c102921030b2003200441386c6a21082003200641386c6a22092104034020044200370200200441286a4200370200200441186a4200370200200441106a4200370200200441086a4200370200200441206a4200370200200441306a4200370200200441386a21042001417f6a22010d000b024002402000280204220a20002802002205470d002000200836020820002004360204200020093602000c010b2005200a6b210b410021010340200920016a220341786a2206417f360200200341486a220741003a00000240200a20016a220541786a220c280200220d417f460d00200241086a2007200541486a200d4102744194c5006a2802001102002006200c2802003602000b2003417c6a2005417c6a2f01003b0100200b200141486a2201470d000b200020083602082000280204210320002004360204200028020021052000200920016a36020020032005460d000340200341486a21040240200341786a22012802002200417f460d002002200341486a20004102744188c5006a2802001101000b2001417f3602002004210320052004470d000b0b2005450d002005102a0b200241106a24000f0b2000102c000bdf0203027f017e037f230041306b220224002000280204210342002104410021050340024020032000280208490d0041004183c5001001200028020421030b20032d000021062000200341016a22073602042004200641ff0071200541ff0171220374ad842104200341076a2105200721032006418001710d000b024002402004a722030d00410021030340200220036a2106024020002802082007470d00410041d9c4001001200028020421070b200620074101100f1a2000200028020441016a2207360204200341016a22034121470d000b024020012802302203417f460d00200241286a200120034102744188c5006a2802001101000b2001200229030037000020014100360230200141206a200241206a2d00003a0000200141186a200241186a290300370000200141106a200241106a290300370000200141086a200241086a2903003700000c010b20002001200310670b200241306a240020000b4c0020012002290000370000200141206a200241206a2d00003a0000200141186a200241186a290000370000200141106a200241106a290000370000200141086a200241086a2900003700000b4c0020012002290000370000200141206a200241206a2d00003a0000200141186a200241186a290000370000200141106a200241106a290000370000200141086a200241086a2900003700000b7801017f20012002290200370200200141206a200241206a2f01003b0100200141186a200241186a290200370200200141106a200241106a290200370200200141086a200241086a2902003702002001412c6a2002412c6a22032802003602002001200229022437022420024200370224200341003602000be70401037f230041c0006b22032400024002402002417f6a220241014b0d000240024020020e020001000b20002802042102410021040340200341086a20046a2105024020002802082002470d00410041d9c4001001200028020421020b200520024101100f1a2000200028020441016a2202360204200441016a22044121470d000b024020012802302200417f460d00200341386a200120004102744188c5006a2802001101000b2001200329030837000020014101360230200141206a200341086a41206a2d00003a0000200141186a200341086a41186a290300370000200141106a200341086a41106a290300370000200141086a200341086a41086a2903003700000c020b200341346a41003602002003420037022c20002802042102410021040340200341086a20046a2105024020002802082002470d00410041d9c4001001200028020421020b200520024101100f1a2000200028020441016a2202360204200441016a22044121470d000b200341296a2104024020002802082002470d00410041d9c4001001200028020421020b200420024101100f1a2000200028020441016a36020420002003412c6a220210681a024020012802302200417f460d00200341386a200120004102744188c5006a2802001101000b200120032903083702002001410236023020012002290200370224200141206a200341086a41206a2f01003b0100200141186a200341086a41186a290300370200200141106a200341086a41106a290300370200200141086a200341086a41086a2903003702002001412c6a200241086a2802003602000c010b410041a0c50010010b200341c0006a24000ba00301057f230041206b2202240020024100360218200242003703102000200241106a10421a0240024002402002280214200228021022036b2204450d00200241086a410036020020024200370300200441704f0d02024002402004410a4b0d00200220044101743a0000200241017221050c010b200441106a4170712206102921052002200436020420022006410172360200200220053602080b0340200520032d00003a0000200541016a2105200341016a21032004417f6a22040d000b200541003a00000240024020012d00004101710d00200141003b01000c010b200128020841003a00002001410036020420012d0000410171450d002001280208102a200141003602000b20012002290300370200200141086a200241086a2802003602000c010b0240024020012d00004101710d00200141003b01000c010b200128020841003a00002001410036020420012d0000410171450d002001280208102a200141003602000b20014100360208200142003702000b024020022802102205450d00200220053602142005102a0b200241206a240020000f0b2002102b000b0beb0503004190c0000b796661696c656420746f20616c6c6f6361746520706167657300756e6578706563746564206572726f7220696e2066697865645f627974657320636f6e7374727563746f7200746865206f6e6572726f7220616374696f6e2063616e6e6f742062652063616c6c6564206469726563746c790000000000000000004189c1000bd904000000000000006461746173747265616d20617474656d7074656420746f20777269746520706173742074686520656e64000a006665617475726520646967657374206163746976617465643a200070726f746f636f6c2066656174757265206973206e6f74206163746976617465640000000100000002000000030000006461746173747265616d20617474656d7074656420746f20777269746520706173742074686520656e6400000400000005000000060000006f626a6563742070617373656420746f206974657261746f725f746f206973206e6f7420696e206d756c74695f696e646578006572726f722072656164696e67206974657261746f720063616e6e6f7420637265617465206f626a6563747320696e207461626c65206f6620616e6f7468657220636f6e7472616374006f626a6563742070617373656420746f206d6f64696679206973206e6f7420696e206d756c74695f696e6465780063616e6e6f74206d6f64696679206f626a6563747320696e207461626c65206f6620616e6f7468657220636f6e747261637400757064617465722063616e6e6f74206368616e6765207072696d617279206b6579207768656e206d6f64696679696e6720616e206f626a656374006461746173747265616d20617474656d7074656420746f207265616420706173742074686520656e640067657400000700000008000000090000000a0000000b0000000c000000696e76616c69642076617269616e7420696e64657800756e6578706563746564206572726f7220696e2066697865645f627974657320636f6e7374727563746f72000041000b04e82200000000000000000000000033b8da17f14fd29bc3816c633afb522ccb52b71e33f3474f9b3b46b38d9fdcbc04000000033b3d4b01000000040fe1293299472996f03cf30560d9279afc23397ac2c9e2bd8ebf9daa010000000000ea3055024900000000000000000000000000 +DMLOG APPLIED_TRANSACTION 4 8a3984f522d3f6667cf3263234f9b8f5b02c3dd27fc4e5b811c3dcabdd7b30ac04000000033b3d4b0100000004119dde5dc2ba60b1c4f1013a50ea81abfa00d53b1c9bd42d37f5a79e0100d0070000dc060000000000000000e01a0000000000000001010000010000000000ea3055378d583c2888f3564b4db37bfb52d74d038e54fcc63aeb57cf27b03c001e97a51b000000000000001b00000000000000010000000000ea30551b0000000000000002010000000000ea30550000000000ea305500000040258ab2c2010000000000ea305500000000a8ed3232cb99010000000000ea30550000be99010061736d010000000198011960000060027f7f0060037f7f7f0060047e7e7e7e017f6000017e60047f7e7e7f0060057f7f7f7f7f017f60037f7f7f017f60027f7f017f60027f7f017e60057f7f7f7f7f0060067e7e7e7e7f7f017f60017e0060027e7f0060047e7e7e7e0060037e7f7f017e60017f0060017f017f6000017f60027f7e0060047f7e7f7f0060037e7e7e0060037f7e7f0060047f7f7f7f0060027e7e0002f0052403656e760b64625f66696e645f693634000303656e760c656f73696f5f617373657274000103656e761063757272656e745f7265636569766572000403656e760561626f7274000003656e760d6173736572745f736861323536000203656e760b6173736572745f73686131000203656e760d6173736572745f736861353132000203656e76106173736572745f726970656d64313630000203656e7606736861323536000203656e76095f5f6173686c746933000503656e760473686131000203656e7606736861353132000203656e7609726970656d64313630000203656e760b7265636f7665725f6b6579000603656e76207365745f626c6f636b636861696e5f706172616d65746572735f7061636b6564000103656e76066d656d637079000703656e76206765745f626c6f636b636861696e5f706172616d65746572735f7061636b6564000803656e76167365745f70726f706f7365645f70726f647563657273000903656e760c63757272656e745f74696d65000403656e76146765745f6163746976655f70726f647563657273000803656e76087072696e74735f6c000103656e76126173736572745f7265636f7665725f6b6579000a03656e760c64625f73746f72655f693634000b03656e760c726571756972655f61757468000c03656e760e7365745f70726976696c65676564000d03656e76137365745f7265736f757263655f6c696d697473000e03656e76197365745f70726f706f7365645f70726f6475636572735f6578000f03656e761370726561637469766174655f66656174757265001003656e76067072696e7473001003656e761469735f666561747572655f616374697661746564001103656e7610616374696f6e5f646174615f73697a65001203656e7610726561645f616374696f6e5f64617461000803656e7611656f73696f5f6173736572745f636f6465001303656e760a64625f6765745f693634000703656e760d64625f7570646174655f693634001403656e76087072696e7468657800010346450015111000111010100c100802101608020817010110011818181818181808011818181818080101180818181808000808010101080101010801010102080108020202020804050170010d0d05030100010616037f014180c0000b7f0041e2c5000b7f0041e2c5000b070901056170706c7900250912010041010b0c555657595a5b5d5e5f6465660aab8b0145040010280bdd03002000102d102420002001510440428080f9d4a98499dc9a7f200251044020002001103b05428080add68d959ba955200251044020002001103c05428080add68d95abd1ca00200251044020002001103d0542808080e8b2edc0d38b7f200251044020002001103e05428080add68db8baf154200251044020002001103f054280f8a6d4d2a8a1d3c1002002510440200020011040054280808080d4c4a2d942200251044020002001104105428080808080f798d9422002510440200020011044054280808080aefadeeaa47f2002510440200020011045054280808080b6f7d6d942200251044020002001104605428080b8f6a4979ad94220025104402000200110470542808080c093fad6d9422002510440200020011048054280808096cdebd4d942200251044020002001104c054280808080daac9bd6ba7f200251044020002001104e0542808080d0b2b3bb9932200251044020002001104f054290a9d9d9dd8c99d6ba7f2002510440200020011050052000428080808080c0ba98d500520440410042808080d9d3b3ed82ef0010200b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b05428080808080c0ba98d50020015104404280808080aefadeeaa47f2002510440410042818080d9d3b3ed82ef0010200b0b0b410010310b7201037f024020000d0041000f0b4100410028028c40200041107622016a220236028c404100410028028440220320006a410f6a4170712200360284400240200241107420004b0d004100200241016a36028c40200141016a21010b024020014000417f470d0041004190c00010010b20030b02000b3601017f230041106b2200410036020c4100200028020c280200410f6a417071220036028040410020003602844041003f0036028c400b3301027f2000410120001b2101024003402001102622000d01410021004100280284412202450d0120021100000c000b0b20000b0600200010270b05001003000b05001003000b0a0041002000370388410b4e01017f230041e0006b220124002001200141d8006a3602082001200141106a3602042001200141106a36020020012000102f1a200141106a200128020420012802006b100e200141e0006a24000ba20801027f02402000280208200028020422026b41074a0d0041004190c1001001200028020421020b200220014108100f1a2000200028020441086a2202360204200141086a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a22023602042001410c6a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141106a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141146a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141186a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a22023602042001411c6a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141206a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141246a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141286a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a22023602042001412c6a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141306a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141346a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141386a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a22023602042001413c6a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141c0006a21030240200028020820026b41014a0d0041004190c1001001200028020421020b200220034102100f1a2000200028020441026a2202360204200141c2006a21010240200028020820026b41014a0d0041004190c1001001200028020421020b200220014102100f1a2000200028020441026a36020420000bfa0103017f027e017f230041306b2203240020012002200341106a1008420021044110210141002102420021050340200341106a20026a21060240024020014102490d002005420886200420063100008422044238888421052001417f6a2101200442088621040c010b024020014101460d00410041a9c00010010b200020053703082000200420063100008437030041102101200041106a210042002104420021050b200241016a22024120470d000b024020014110460d00024020014102490d00200320042005200141037441786a1009200341086a2903002105200329030021040b20002004370300200020053703080b200341306a24000b02000b970503017f017e047f230041f0006b22032400200341206a4100360200200342003703182003427f37031020032000290300220437030820032004370300024002402004200442808080809aecb4ee312001100022004100480d00024020032000103322002802302003460d00410041c0c20010010b2003200236023020032000200341306a10340c010b024020041002510d004100418ac30010010b41c000102922004200370310200041286a22054200370300200041206a22064200370300200041186a220742003703002000200336023020002001370300200341306a20022802002208200228020420086b10302005200341306a41186a2903003703002006200341306a41106a29030037030020072003290338370300200020032903303703102003200341306a41286a3602682003200341306a360260200341306a20004108100f1a2003200341306a410872360264200341e0006a200041106a10351a2000200329030842808080809aecb4ee31200120002903002204200341306a412810162205360234024020042003290310540d002003427e200442017c2004427d561b3703100b200320003602602003200029030022043703302003200536022c02400240200328021c220220032802204f0d00200220053602102002200437030820034100360260200220003602002003200241186a36021c0c010b200341186a200341e0006a200341306a2003412c6a10360b20032802602100200341003602602000450d002000102a0b024020032802182205450d0002400240200328021c22002005470d00200521000c010b0340200041686a220028020021022000410036020002402002450d002002102a0b20052000470d000b200328021821000b2003200536021c2000102a0b200341f0006a24000b840603097f027e017f230041e0006b220221032002240002400240200028021822042000411c6a2802002205460d0002400340200541786a2802002001460d012004200541686a2205470d000c020b0b20042005460d00200541686a28020021060c010b024002400240024020014100410010212205417f4a0d00410041f3c20010010c010b2005418104490d010b200510262107410121080c010b20022005410f6a4170716b22072400410021080b20012007200510211a41c0001029220642003703102006420037030020062000360230200641186a4200370300200641206a4200370300200641286a42003703000240200541074b0d00410041d9c40010010b200620074108100f1a200741086a21040240200541786a411f4b0d00410041d9c40010010b200041186a2109200641106a210a200341c0006a20044120100f1a4200210b41102105200341206a2102410021044200210c0340200341c0006a20046a210d0240024020054102490d00200c420886200b200d31000084220b42388884210c2005417f6a2105200b420886210b0c010b024020054101460d00410041b6c50010010b2002200c3703082002200b200d3100008437030041102105200241106a21024200210b4200210c0b200441016a22044120470d000b024020054110460d00024020054102490d00200341086a200b200c200541037441786a1009200341106a290300210c2003290308210b0b2002200b3703002002200c3703080b200a2003290320370300200a41086a2003290328370300200a41186a200341206a41186a290300370300200a41106a200341206a41106a290300370300200620013602342003200636022020032006290300220b3703402003200136021c02400240200028021c2205200041206a2802004f0d00200520013602102005200b37030820034100360220200520063602002000200541186a36021c0c010b2009200341206a200341c0006a2003411c6a10360b02402008450d00200710270b20032802202105200341003602202005450d002005102a0b200341e0006a240020060b980203027f017e017f230041206b2203210420032400024020012802302000460d00410041bdc30010010b024010022000290300510d00410041ebc30010010b200129030021052004200228020022022802002206200228020420066b1030200141286a200441186a290300370300200141206a200441106a290300370300200141186a200429030837030020012004290300370310200141106a2102024020052001290300510d004100419ec40010010b200341506a220324002004200341286a36020820042003360200200320014108100f1a2004200341086a3602042004200210351a20012802344200200341281022024020052000290310540d002000427e200542017c2005427d561b3703100b200441206a24000bd20303017f027e017f230041206b220224002002200141186a29030022033c00172002200141086a29030022044220883c0003200220044228883c0002200220044230883c0001200220044238883c0000200220034220883c001320022003a722054108763a0016200220054110763a0015200220054118763a001420022004a722053a0007200220054108763a0006200220054110763a0005200220054118763a0004200220012903002204423886200442288642808080808080c0ff0083842004421886428080808080e03f8320044208864280808080f01f838484200442088842808080f80f832004421888428080fc07838420044228884280fe03832004423888848484370308200220012903102204423886200442288642808080808080c0ff0083842004421886428080808080e03f8320044208864280808080f01f838484200442088842808080f80f832004421888428080fc07838420044228884280fe03832004423888848484370318200220034230883c0011200220034228883c0012200220034238883c001002402000280208200028020422016b411f4a0d0041004188c2001001200028020421010b200120024120100f1a2000200028020441206a360204200241206a240020000b9a0301057f0240024002402000280204200028020022046b41186d220541016a220641abd5aad5004f0d0041aad5aad500210702400240200028020820046b41186d220441d4aad52a4b0d0020062004410174220720072006491b22070d0041002107410021040c010b200741186c102921040b20012802002106200141003602002004200541186c22086a2201200328020036021020012002290300370308200120063602002004200741186c6a2105200141186a21062000280204220220002802002207460d01200420086a41686a21010340200241686a220428020021032004410036020020012003360200200141086a200241706a2202290300370300200141106a200241086a280200360200200141686a21012004210220072004470d000b200141186a210120002802042107200028020021040c020b2000102c000b200721040b200020053602082000200636020420002001360200024020072004460d000340200741686a220728020021012007410036020002402001450d002001102a0b20042007470d000b0b02402004450d002004102a0b0bd00203047f017e017f230041106b220224004100210320004100360208200042003702002002410036020020012802042204200128020022056b410575ad21060340200341016a2103200642078822064200520d000b2002200336020002400240024020052004460d0003402002200341086a3602002003410c6a2103200541186a2802002207ad21060340200341016a2103200642078822064200520d000b20022003417c6a3602002007417f460d022002200336020020022005410c6a10511a20022802002103200541206a22052004470d000b20002802002105200028020421070c020b41002105410021070c010b1052000b024002402003200720056b22074d0d002000200320076b1043200028020021050c010b200320074f0d002000200520036a3602040b2002200536020420022005360200200220002802043602082002200110531a200241106a24000baf0302017f027e230041206b22022400200029030010172002200141186a29030022033c00172002200141086a29030022044220883c0003200220044228883c0002200220044230883c0001200220044238883c0000200220034220883c001320022003a722004108763a0016200220004110763a0015200220004118763a001420022004a722003a0007200220004108763a0006200220004110763a0005200220004118763a0004200220012903002204423886200442288642808080808080c0ff0083842004421886428080808080e03f8320044208864280808080f01f838484200442088842808080f80f832004421888428080fc07838420044228884280fe03832004423888848484370308200220012903102204423886200442288642808080808080c0ff0083842004421886428080808080e03f8320044208864280808080f01f838484200442088842808080f80f832004421888428080fc07838420044228884280fe03832004423888848484370318200220034230883c0011200220034228883c0012200220034238883c00102002101b41bdc100101c2001103941bbc100101c200241206a24000b9c0303017f027e017f230041206b220124002001200041186a29030022023c00172001200041086a29030022034220883c0003200120034228883c0002200120034230883c0001200120034238883c0000200120024220883c001320012002a722044108763a0016200120044110763a0015200120044118763a001420012003a722043a0007200120044108763a0006200120044110763a0005200120044118763a0004200120002903002203423886200342288642808080808080c0ff0083842003421886428080808080e03f8320034208864280808080f01f838484200342088842808080f80f832003421888428080fc07838420034228884280fe03832003423888848484370308200120002903102203423886200342288642808080808080c0ff0083842003421886428080808080e03f8320034208864280808080f01f838484200342088842808080f80f832003421888428080fc07838420034228884280fe03832003423888848484370318200120024230883c0011200120024228883c0012200120024238883c0010200141201023200141206a24000ba70303017f027e017f230041206b220224002002200141186a29030022033c00172002200141086a29030022044220883c0003200220044228883c0002200220044230883c0001200220044238883c0000200220034220883c001320022003a722054108763a0016200220054110763a0015200220054118763a001420022004a722053a0007200220054108763a0006200220054110763a0005200220054118763a0004200220012903002204423886200442288642808080808080c0ff0083842004421886428080808080e03f8320044208864280808080f01f838484200442088842808080f80f832004421888428080fc07838420044228884280fe03832004423888848484370308200220012903102204423886200442288642808080808080c0ff0083842004421886428080808080e03f8320044208864280808080f01f838484200442088842808080f80f832004421888428080fc07838420044228884280fe03832004423888848484370318200220034230883c0011200220034228883c0012200220034238883c001002402002101d0d00410041d8c10010010b200241206a24000bb90101047f230041106b2202210320022400024002400240101e22040d002003420037030841002102200341086a21050c010b024002402004418004490d002004102621020c010b20022004410f6a4170716b220224000b20022004101f1a20034200370308200341086a2105200441074b0d010b410041d9c40010010b200520024108100f1a20034200370300200241086a2102024020044178714108470d00410041d9c40010010b200320024108100f1a200341106a24000b4401037f2300220221030240101e2204450d00024002402004418004490d002004102621020c010b20022004410f6a4170716b220224000b20022004101f1a0b200324000b4401037f2300220221030240101e2204450d00024002402004418004490d002004102621020c010b20022004410f6a4170716b220224000b20022004101f1a0b200324000b4401037f2300220221030240101e2204450d00024002402004418004490d002004102621020c010b20022004410f6a4170716b220224000b20022004101f1a0b200324000b4401037f2300220221030240101e2204450d00024002402004418004490d002004102621020c010b20022004410f6a4170716b220224000b20022004101f1a0b200324000b4401037f2300220221030240101e2204450d00024002402004418004490d002004102621020c010b20022004410f6a4170716b220224000b20022004101f1a0b200324000bc90201047f230041306b220221032002240002400240101e22040d00410021020c010b024002402004418004490d002004102621020c010b20022004410f6a4170716b220224000b20022004101f1a0b20032002360224200320023602202003200220046a2205360228200342003703180240200441074b0d00410041d9c400100120032802282105200328022421020b200341186a20024108100f1a2003200241086a2202360224024020052002470d00410041d9c400100120032802282105200328022421020b200341176a20024101100f1a2003200241016a2202360224024020052002470d00410041d9c4001001200328022421020b200341166a20024101100f1a2003200241016a3602242003410036021020034200370308200341206a200341086a10421a024020032802082202450d002003200236020c2002102a0b200341306a24000bff0103017f017e047f2000280204210242002103410021040340024020022000280208490d0041004183c5001001200028020421020b20022d000021052000200241016a22063602042003200541ff0071200441ff0171220274ad842103200241076a2104200621022005418001710d000b0240024020012802042205200128020022026b22072003a722044f0d002001200420076b10432000280204210620012802042105200128020021020c010b200720044d0d002001200220046a22053602040b0240200028020820066b200520026b22054f0d00410041d9c4001001200028020421060b200220062005100f1a2000200028020420056a36020420000b980201057f02400240024020002802082202200028020422036b2001490d000340200341003a00002000200028020441016a22033602042001417f6a22010d000c020b0b2003200028020022046b220520016a2206417f4c0d0141ffffffff07210302400240200220046b220241feffffff034b0d0020062002410174220320032006491b22030d0041002103410021020c010b2003102921020b200220036a2106200220056a220421030340200341003a0000200341016a21032001417f6a22010d000b20042000280204200028020022016b22026b2104024020024101480d00200420012002100f1a200028020021010b2000200636020820002003360204200020043602002001450d002001102a0b0f0b2000102c000bb20202037f017e23004180016b220221032002240002400240101e22040d00410021020c010b024002402004418004490d002004102621020c010b20022004410f6a4170716b220224000b20022004101f1a0b20032002360254200320023602502003200220046a360258200342003703480240200441074b0d00410041d9c4001001200328025421020b200341c8006a20024108100f1a2003200241086a3602542003410036024020034200370338200341d0006a200341386a10421a200341086a41086a200341d0006a41086a2802002202360200200341306a2002360200200320032903502205370308200320013703202003200037031820032005370328200341186a2003290348200341386a1032024020032802382202450d002003200236023c2002102a0b20034180016a24000b4c01037f2300220221030240101e2204450d00024002402004418004490d002004102621020c010b20022004410f6a4170716b220224000b20022004101f1a0b410041d5c0001001200324000bcf0102047f017e230041106b2202210320022400024002400240101e22040d002003420037030841002102200341086a21050c010b024002402004418004490d002004102621020c010b20022004410f6a4170716b220224000b20022004101f1a20034200370308200341086a2105200441074b0d010b410041d9c40010010b200520024108100f1a200241086a2102024020044108470d00410041d9c40010010b200341076a20024101100f1a2003290308210620032d0007210420001017200620044100471018200341106a24000baa0202047f047e230041206b2202210320022400024002400240101e22040d002003420037031841002102200341186a21050c010b024002402004418004490d002004102621020c010b20022004410f6a4170716b220224000b20022004101f1a20034200370318200341186a2105200441074b0d010b410041d9c40010010b200520024108100f1a200241086a21050240200441787122044108470d00410041d9c40010010b200341106a20054108100f1a200241106a2105024020044110470d00410041d9c40010010b200341086a20054108100f1a200241186a2102024020044118470d00410041d9c40010010b200320024108100f1a200329030021062003290308210720032903102108200329031821092000101720092008200720061019200341206a24000ba103010b7f230041306b2202210320022400410021040240101e2205450d00024002402005418004490d002005102621040c010b20022005410f6a4170716b220424000b20042005101f1a0b20032004360214200320043602102003200420056a3602182003410036020820034200370300200341106a200310491a20001017200341206a20031037420120032802202204200328022420046b101a1a024020032802202204450d00200320043602242004102a0b024020032802002206450d0002400240200328020422072006470d00200621040c010b03402007220441606a21070240200441786a2208280200417f460d002004416c6a2209280200220a450d00200a21050240200441706a220b2802002204200a460d000340200441486a21050240200441786a2202280200220c417f460d00200341206a200441486a200c4102744188c5006a2802001101000b2002417f36020020052104200a2005470d000b200928020021050b200b200a3602002005102a0b2008417f36020020072006470d000b200328020021040b200320063602042004102a0b200341306a24000bcc0303027f017e097f230041206b220224002000280204210342002104410021050340024020032000280208490d0041004183c5001001200028020421030b20032d000021062000200341016a22033602042004200641ff0071200541ff0171220574ad842104200541076a2105200321032006418001710d000b0240024020012802042207200128020022056b41057522062004a722034f0d002001200320066b104a200128020421070c010b200620034d0d000240200520034105746a22082007460d0003402007220341606a21070240200341786a2209280200417f460d002003416c6a220a280200220b450d00200b21060240200341706a220c2802002203200b460d000340200341486a21060240200341786a2205280200220d417f460d00200241186a200341486a200d4102744188c5006a2802001101000b2005417f36020020062103200b2006470d000b200a28020021060b200c200b3602002006102a0b2009417f36020020072008470d000b0b20012008360204200821070b0240200128020022032007460d00034020022000360208200220033602102002200341086a360214200241106a200241086a104b200341206a22032007470d000b0b200241206a240020000b9f06030a7f017e037f230041106b220224000240024020002802082203200028020422046b4105752001490d000340200441186a2203420037030020044200370300200441106a4200370300200441086a4200370300200341003602002000200028020441206a22043602042001417f6a22010d000c020b0b02400240024002402004200028020022056b410575220620016a220741808080c0004f0d0041ffffff3f210402400240200320056b220341057541feffff1f4b0d00024020072003410475220420042007491b22040d0041002104410021030c020b200441808080c0004f0d030b2004410574102921030b200320044105746a2108200320064105746a22092104034020044200370300200441186a4200370300200441106a4200370300200441086a4200370300200441206a21042001417f6a22010d000b2000280204220a20002802002206460d022006200a6b210b410021050340200920056a220141786a2206417f360200200a20056a220341606a290300210c200141686a220741003a0000200141606a200c3703000240200341786a280200220d417f460d00200141706a220e42003702002001416c6a220f4100360200200e200341706a280200360200200f2003416c6a220e280200360200200141746a200341746a22012802003602002007200341686a2802003602002006200d36020020014100360200200e42003702000b200b200541606a2205470d000b200920056a2109200028020421062000280200210d0c030b2000102c000b1003000b2006210d0b20002008360208200020043602042000200936020002402006200d460d0003402006220441606a21060240200441786a2207280200417f460d002004416c6a220e2802002200450d00200021010240200441706a220f28020022042000460d000340200441486a21010240200441786a22032802002205417f460d00200241086a200441486a20054102744188c5006a2802001101000b2003417f3602002001210420002001470d000b200e28020021010b200f20003602002001102a0b2007417f3602002006200d470d000b0b200d450d00200d102a0b200241106a24000bca0102037f017e20002802002102024020012802002203280208200328020422046b41074b0d00410041d9c4001001200328020421040b200220044108100f1a2003200328020441086a3602042000280204210220012802002201280204210342002105410021040340024020032001280208490d0041004183c5001001200128020421030b20032d000021002001200341016a22033602042005200041ff0071200441ff0171220474ad842105200441076a2104200321032000418001710d000b200120022005a710600b890101037f230041e0006b220221032002240002400240101e22040d00410021020c010b024002402004418004490d002004102621020c010b20022004410f6a4170716b220224000b20022004101f1a0b20032002360254200320023602502003200220046a360258200341d0006a200341086a104d1a20001017200341086a102e200341e0006a24000ba20801027f02402000280208200028020422026b41074b0d00410041d9c4001001200028020421020b200120024108100f1a2000200028020441086a2202360204200141086a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a22023602042001410c6a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141106a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141146a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141186a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a22023602042001411c6a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141206a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141246a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141286a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a22023602042001412c6a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141306a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141346a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141386a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a22023602042001413c6a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141c0006a21030240200028020820026b41014b0d00410041d9c4001001200028020421020b200320024102100f1a2000200028020441026a2202360204200141c2006a21010240200028020820026b41014b0d00410041d9c4001001200028020421020b200120024102100f1a2000200028020441026a36020420000b940101047f230041106b2202210320022400024002400240101e22040d002003420037030841002102200341086a21050c010b024002402004418004490d002004102621020c010b20022004410f6a4170716b220224000b20022004101f1a20034200370308200341086a2105200441074b0d010b410041d9c40010010b200520024108100f1a20032903081017200341106a24000b8c0405047f017e037f017e017f230041f0006b220221032002240002400240101e22040d00410021050c010b024002402004418004490d002004102621050c010b20022004410f6a4170716b220524000b20052004101f1a0b42002106200341286a420037030041102102200341106a41106a4200370300200342003703182003420037031002402004411f4b0d00410041d9c40010010b200520046a2107200341d0006a20054120100f1a200541206a2108200341306a2109410021044200210a0340200341d0006a20046a210b0240024020024102490d00200a4208862006200b31000084220642388884210a2002417f6a2102200642088621060c010b024020024101460d00410041b6c50010010b2009200a37030820092006200b3100008437030041102102200941106a2109420021064200210a0b200441016a22044120470d000b024020024110460d00024020024102490d0020032006200a200241037441786a1009200341086a290300210a200329030021060b200920063703002009200a3703080b200341106a41186a200341306a41186a290300370300200341106a41106a200341306a41106a2903003703002003200329033837031820032003290330370310200341d0006a41186a2007360200200341e4006a2008360200200320053602602003200137035820032000370350200341d0006a200341106a1038200341f0006a24000bc80303047f027e017f230041f0006b220221032002240002400240101e22040d00410021050c010b024002402004418004490d002004102621050c010b20022004410f6a4170716b220524000b20052004101f1a0b42002106200341286a420037030041102102200341106a41106a4200370300200342003703182003420037031002402004411f4b0d00410041d9c40010010b200341d0006a20054120100f1a200341306a210541002104420021070340200341d0006a20046a21080240024020024102490d002007420886200620083100008422064238888421072002417f6a2102200642088621060c010b024020024101460d00410041b6c50010010b200520073703082005200620083100008437030041102102200541106a210542002106420021070b200441016a22044120470d000b024020024110460d00024020024102490d00200320062007200241037441786a1009200341086a2903002107200329030021060b20052006370300200520073703080b200341106a41186a200341306a41186a290300370300200341106a41106a200341306a41106a29030037030020032003290338370318200320032903303703102002200341106a103a200341f0006a24000bd50103037f017e017f230041106b2202240020012802042203200128020022046b41386dad2105200028020021010340200141016a2101200542078822054200520d000b200020013602000240024020042003460d00034020042802302206ad21050340200141016a2101200542078822054200520d000b20002001360200200220003602002006417f460d0220022002360208200241086a2004200641027441fcc1006a2802001101002000200028020041026a2201360200200441386a22042003470d000b0b200241106a240020000f0b1052000b05001003000bfe0103017f017e037f230041106b22022400200128020420012802006b410575ad21032000280204210403402003a721052002200342078822034200522206410774200541ff0071723a000f0240200028020820046b41004a0d0041004188c2001001200028020421040b20042002410f6a4101100f1a2000200028020441016a220436020420060d000b02402001280200220520012802042206460d0003400240200028020820046b41074a0d0041004188c2001001200028020421040b200420054108100f1a2000200028020441086a3602042000200541086a10541a200541206a22052006460d01200028020421040c000b0b200241106a240020000bdd0103027f017e027f230041106b22022400200028020421032001350210210403402004a721052002200442078822044200522206410774200541ff0071723a000f0240200028020820036b41004a0d0041004188c2001001200028020421030b20032002410f6a4101100f1a2000200028020441016a220336020420060d000b02402001280210417f460d00200141046a21050240200028020820036b41034a0d0041004188c2001001200028020421030b200320014104100f1a2000200028020441046a3602042000200510581a200241106a240020000f0b1052000b170020002802002802002200200028020041216a3602000b170020002802002802002200200028020041216a3602000b7602017f017e20002802002802002202200228020041226a2200360200200141286a350200420020012d00244101711b21030340200041016a2100200342078822034200520d000b200220003602000240200128022820012d0024220141017620014101711b2201450d002002200120006a3602000b0b990303017f017e047f230041106b22022400200128020420012802006b41386dad21032000280204210403402003a721052002200342078822034200522206410774200541ff0071723a000f0240200028020820046b41004a0d0041004188c2001001200028020421040b20042002410f6a4101100f1a2000200028020441016a220436020420060d000b024002402001280200220720012802042201460d0003402007350230210303402003a721052002200342078822034200522206410774200541ff0071723a000e0240200028020820046b41004a0d0041004188c2001001200028020421040b20042002410e6a4101100f1a2000200028020441016a220436020420060d000b2002200036020020072802302204417f460d0220022002360208200241086a2007200441027441b4c2006a280200110100200741346a210502402000280208200028020422046b41014a0d0041004188c2001001200028020421040b200420054102100f1a2000200028020441026a2204360204200741386a22072001470d000b0b200241106a240020000f0b1052000b6401037f200028020028020022002802042102410021030340200120036a21040240200028020820026b41004a0d0041004188c2001001200028020421020b200220044101100f1a2000200028020441016a2202360204200341016a22034121470d000b0b6401037f200028020028020022002802042102410021030340200120036a21040240200028020820026b41004a0d0041004188c2001001200028020421020b200220044101100f1a2000200028020441016a2202360204200341016a22034121470d000b0baa0101037f200028020028020022002802042102410021030340200120036a21040240200028020820026b41004a0d0041004188c2001001200028020421020b200220044101100f1a2000200028020441016a2202360204200341016a22034121470d000b200141216a21030240200028020820026b41004a0d0041004188c2001001200028020421020b200220034101100f1a2000200028020441016a3602042000200141246a105c1a0bfd0103027f017e027f230041106b22022400200128020420012d0000220341017620034101711bad21042000280204210303402004a721052002200442078822044200522206410774200541ff0071723a000f0240200028020820036b41004a0d0041004188c2001001200028020421030b20032002410f6a4101100f1a2000200028020441016a220336020420060d000b0240200128020420012d00002205410176200541017122061b2205450d002001280208200141016a20061b21060240200028020820036b20054e0d0041004188c2001001200028020421030b200320062005100f1a2000200028020420056a3602040b200241106a240020000b02000b02000b1a00024020012d0024410171450d002001412c6a280200102a0b0bae0201047f230041206b220324000240024020020d00200341146a41003602002003420037020c200341086a410472210402402000280208200028020422026b41034b0d00410041d9c4001001200028020421020b200341086a20024104100f1a2000200028020441046a3602042000200410611a02402001280210417f460d0020012802042205450d00200521020240200141086a28020022002005460d000340200041486a21020240200041786a22042802002206417f460d00200341186a200041486a20064102744188c5006a2802001101000b2004417f3602002002210020052002470d000b200128020421020b200120053602082002102a0b2001200329030837020020014100360210200141086a20032903103702000c010b410041a0c50010010b200341206a24000b870303027f017e047f230041106b220224002000280204210342002104410021050340024020032000280208490d0041004183c5001001200028020421030b20032d000021062000200341016a22033602042004200641ff0071200541ff0171220574ad842104200541076a2105200321032006418001710d000b0240024020012802042205200128020022076b41386d22062004a722034f0d002001200320066b1062200128020421050c010b200620034d0d0002402007200341386c6a22082005460d000340200541486a21030240200541786a22062802002207417f460d00200241086a200541486a20074102744188c5006a2802001101000b2006417f3602002003210520082003470d000b0b20012008360204200821050b0240200128020022032005460d0003402000200310631a02402000280208200028020422066b41014b0d00410041d9c4001001200028020421060b200341346a20064102100f1a2000200028020441026a360204200341386a22032005470d000b0b200241106a240020000ba105010c7f230041106b2202240002400240024020002802082203200028020422046b41386d2001490d000340200441306a2203420037020020044200370200200441286a4200370200200441186a4200370200200441106a4200370200200441086a4200370200200441206a4200370200200341003602002000200028020441386a22043602042001417f6a22010d000c020b0b2004200028020022056b41386d220620016a220741a592c9244f0d0141a492c924210402400240200320056b41386d22034191c9a4124b0d0020072003410174220420042007491b22040d0041002104410021030c010b200441386c102921030b2003200441386c6a21082003200641386c6a22092104034020044200370200200441286a4200370200200441186a4200370200200441106a4200370200200441086a4200370200200441206a4200370200200441306a4200370200200441386a21042001417f6a22010d000b024002402000280204220a20002802002205470d002000200836020820002004360204200020093602000c010b2005200a6b210b410021010340200920016a220341786a2206417f360200200341486a220741003a00000240200a20016a220541786a220c280200220d417f460d00200241086a2007200541486a200d4102744194c5006a2802001102002006200c2802003602000b2003417c6a2005417c6a2f01003b0100200b200141486a2201470d000b200020083602082000280204210320002004360204200028020021052000200920016a36020020032005460d000340200341486a21040240200341786a22012802002200417f460d002002200341486a20004102744188c5006a2802001101000b2001417f3602002004210320052004470d000b0b2005450d002005102a0b200241106a24000f0b2000102c000bdf0203027f017e037f230041306b220224002000280204210342002104410021050340024020032000280208490d0041004183c5001001200028020421030b20032d000021062000200341016a22073602042004200641ff0071200541ff0171220374ad842104200341076a2105200721032006418001710d000b024002402004a722030d00410021030340200220036a2106024020002802082007470d00410041d9c4001001200028020421070b200620074101100f1a2000200028020441016a2207360204200341016a22034121470d000b024020012802302203417f460d00200241286a200120034102744188c5006a2802001101000b2001200229030037000020014100360230200141206a200241206a2d00003a0000200141186a200241186a290300370000200141106a200241106a290300370000200141086a200241086a2903003700000c010b20002001200310670b200241306a240020000b4c0020012002290000370000200141206a200241206a2d00003a0000200141186a200241186a290000370000200141106a200241106a290000370000200141086a200241086a2900003700000b4c0020012002290000370000200141206a200241206a2d00003a0000200141186a200241186a290000370000200141106a200241106a290000370000200141086a200241086a2900003700000b7801017f20012002290200370200200141206a200241206a2f01003b0100200141186a200241186a290200370200200141106a200241106a290200370200200141086a200241086a2902003702002001412c6a2002412c6a22032802003602002001200229022437022420024200370224200341003602000be70401037f230041c0006b22032400024002402002417f6a220241014b0d000240024020020e020001000b20002802042102410021040340200341086a20046a2105024020002802082002470d00410041d9c4001001200028020421020b200520024101100f1a2000200028020441016a2202360204200441016a22044121470d000b024020012802302200417f460d00200341386a200120004102744188c5006a2802001101000b2001200329030837000020014101360230200141206a200341086a41206a2d00003a0000200141186a200341086a41186a290300370000200141106a200341086a41106a290300370000200141086a200341086a41086a2903003700000c020b200341346a41003602002003420037022c20002802042102410021040340200341086a20046a2105024020002802082002470d00410041d9c4001001200028020421020b200520024101100f1a2000200028020441016a2202360204200441016a22044121470d000b200341296a2104024020002802082002470d00410041d9c4001001200028020421020b200420024101100f1a2000200028020441016a36020420002003412c6a220210681a024020012802302200417f460d00200341386a200120004102744188c5006a2802001101000b200120032903083702002001410236023020012002290200370224200141206a200341086a41206a2f01003b0100200141186a200341086a41186a290300370200200141106a200341086a41106a290300370200200141086a200341086a41086a2903003702002001412c6a200241086a2802003602000c010b410041a0c50010010b200341c0006a24000ba00301057f230041206b2202240020024100360218200242003703102000200241106a10421a0240024002402002280214200228021022036b2204450d00200241086a410036020020024200370300200441704f0d02024002402004410a4b0d00200220044101743a0000200241017221050c010b200441106a4170712206102921052002200436020420022006410172360200200220053602080b0340200520032d00003a0000200541016a2105200341016a21032004417f6a22040d000b200541003a00000240024020012d00004101710d00200141003b01000c010b200128020841003a00002001410036020420012d0000410171450d002001280208102a200141003602000b20012002290300370200200141086a200241086a2802003602000c010b0240024020012d00004101710d00200141003b01000c010b200128020841003a00002001410036020420012d0000410171450d002001280208102a200141003602000b20014100360208200142003702000b024020022802102205450d00200220053602142005102a0b200241206a240020000f0b2002102b000b0beb0503004190c0000b796661696c656420746f20616c6c6f6361746520706167657300756e6578706563746564206572726f7220696e2066697865645f627974657320636f6e7374727563746f7200746865206f6e6572726f7220616374696f6e2063616e6e6f742062652063616c6c6564206469726563746c790000000000000000004189c1000bd904000000000000006461746173747265616d20617474656d7074656420746f20777269746520706173742074686520656e64000a006665617475726520646967657374206163746976617465643a200070726f746f636f6c2066656174757265206973206e6f74206163746976617465640000000100000002000000030000006461746173747265616d20617474656d7074656420746f20777269746520706173742074686520656e6400000400000005000000060000006f626a6563742070617373656420746f206974657261746f725f746f206973206e6f7420696e206d756c74695f696e646578006572726f722072656164696e67206974657261746f720063616e6e6f7420637265617465206f626a6563747320696e207461626c65206f6620616e6f7468657220636f6e7472616374006f626a6563742070617373656420746f206d6f64696679206973206e6f7420696e206d756c74695f696e6465780063616e6e6f74206d6f64696679206f626a6563747320696e207461626c65206f6620616e6f7468657220636f6e747261637400757064617465722063616e6e6f74206368616e6765207072696d617279206b6579207768656e206d6f64696679696e6720616e206f626a656374006461746173747265616d20617474656d7074656420746f207265616420706173742074686520656e640067657400000700000008000000090000000a0000000b0000000c000000696e76616c69642076617269616e7420696e64657800756e6578706563746564206572726f7220696e2066697865645f627974657320636f6e7374727563746f72000041000b04e8220000000000000000000000008a3984f522d3f6667cf3263234f9b8f5b02c3dd27fc4e5b811c3dcabdd7b30ac04000000033b3d4b0100000004119dde5dc2ba60b1c4f1013a50ea81abfa00d53b1c9bd42d37f5a79e010000000000ea3055024900000000000000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG RAM_OP 0 eosio abi update setabi eosio 199629 137 DMLOG DB_OP UPD 0 eosio:eosio eosio eosio abihash eosio 0000000000ea3055d7abd75d188060de8a01ab2672d1cc2cd768fddc56203181b43685cc11f5ce46:0000000000ea3055fc470c7761cfe2530d91ab199fc6326b456e254a57fcc882544eb4c0e488fd39 -DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304003,"value_ex":102692,"consumed":7921},"cpu_usage":{"last_ordinal":1262304003,"value_ex":291109,"consumed":4101},"ram_usage":199629} -DMLOG APPLIED_TRANSACTION 4 b085979b5caaf96c180792bea37b863e8b3401fe946ffa0668d97519e4db614504000000033b3d4b01000000040fe1293299472996f03cf30560d9279afc23397ac2c9e2bd8ebf9daa0100d00700008201000000000000000010040000000000000001010000010000000000ea30552deb8b0eef2f2bfd027d20727a96e4b30eb6ccdc27488670d57bf488395c48fc1c000000000000001c00000000000000010000000000ea30551c0000000000000002020000000000ea30550000000000ea305500000000b863b2c2010000000000ea305500000000a8ed323293120000000000ea305589120e656f73696f3a3a6162692f312e320117626c6f636b5f7369676e696e675f617574686f726974792276617269616e745f626c6f636b5f7369676e696e675f617574686f726974795f763019086162695f686173680002056f776e6572046e616d6504686173680b636865636b73756d32353608616374697661746500010e666561747572655f6469676573740b636865636b73756d32353609617574686f726974790004097468726573686f6c640675696e743332046b6579730c6b65795f7765696768745b5d086163636f756e7473197065726d697373696f6e5f6c6576656c5f7765696768745b5d0577616974730d776169745f7765696768745b5d1a626c6f636b5f7369676e696e675f617574686f726974795f76300002097468726573686f6c640675696e743332046b6579730c6b65795f7765696768745b5d15626c6f636b636861696e5f706172616d65746572730011136d61785f626c6f636b5f6e65745f75736167650675696e7436341a7461726765745f626c6f636b5f6e65745f75736167655f7063740675696e743332196d61785f7472616e73616374696f6e5f6e65745f75736167650675696e7433321e626173655f7065725f7472616e73616374696f6e5f6e65745f75736167650675696e743332106e65745f75736167655f6c65657761790675696e74333223636f6e746578745f667265655f646973636f756e745f6e65745f75736167655f6e756d0675696e74333223636f6e746578745f667265655f646973636f756e745f6e65745f75736167655f64656e0675696e743332136d61785f626c6f636b5f6370755f75736167650675696e7433321a7461726765745f626c6f636b5f6370755f75736167655f7063740675696e743332196d61785f7472616e73616374696f6e5f6370755f75736167650675696e743332196d696e5f7472616e73616374696f6e5f6370755f75736167650675696e743332186d61785f7472616e73616374696f6e5f6c69666574696d650675696e7433321e64656665727265645f7472785f65787069726174696f6e5f77696e646f770675696e743332156d61785f7472616e73616374696f6e5f64656c61790675696e743332166d61785f696e6c696e655f616374696f6e5f73697a650675696e743332176d61785f696e6c696e655f616374696f6e5f64657074680675696e743136136d61785f617574686f726974795f64657074680675696e7431360b63616e63656c64656c617900020e63616e63656c696e675f61757468107065726d697373696f6e5f6c6576656c067472785f69640b636865636b73756d3235360a64656c657465617574680002076163636f756e74046e616d650a7065726d697373696f6e046e616d650a6b65795f7765696768740002036b65790a7075626c69635f6b6579067765696768740675696e743136086c696e6b617574680004076163636f756e74046e616d6504636f6465046e616d650474797065046e616d650b726571756972656d656e74046e616d650a6e65776163636f756e7400040763726561746f72046e616d65046e616d65046e616d65056f776e657209617574686f726974790661637469766509617574686f72697479076f6e6572726f7200020973656e6465725f69640775696e743132380873656e745f747278056279746573107065726d697373696f6e5f6c6576656c0002056163746f72046e616d650a7065726d697373696f6e046e616d65177065726d697373696f6e5f6c6576656c5f77656967687400020a7065726d697373696f6e107065726d697373696f6e5f6c6576656c067765696768740675696e7431361270726f64756365725f617574686f7269747900020d70726f64756365725f6e616d65046e616d6509617574686f7269747917626c6f636b5f7369676e696e675f617574686f726974790c72657161637469766174656400010e666561747572655f6469676573740b636865636b73756d323536077265716175746800010466726f6d046e616d65067365746162690002076163636f756e74046e616d65036162690562797465730a736574616c696d6974730004076163636f756e74046e616d650972616d5f627974657305696e7436340a6e65745f77656967687405696e7436340a6370755f77656967687405696e74363407736574636f64650004076163636f756e74046e616d6506766d747970650575696e743809766d76657273696f6e0575696e743804636f646505627974657309736574706172616d73000106706172616d7315626c6f636b636861696e5f706172616d657465727307736574707269760002076163636f756e74046e616d650769735f707269760575696e74380873657470726f64730001087363686564756c651470726f64756365725f617574686f726974795b5d0a756e6c696e6b617574680003076163636f756e74046e616d6504636f6465046e616d650474797065046e616d650a757064617465617574680004076163636f756e74046e616d650a7065726d697373696f6e046e616d6506706172656e74046e616d65046175746809617574686f726974790b776169745f776569676874000208776169745f7365630675696e743332067765696768740675696e743136100000002a9bed32320861637469766174650000bc892a4585a6410b63616e63656c64656c6179000040cbdaa8aca24a0a64656c65746561757468000000002d6b03a78b086c696e6b617574680000409e9a2264b89a0a6e65776163636f756e7400000000e0d27bd5a4076f6e6572726f7200905436db6564acba0c72657161637469766174656400000000a0656dacba07726571617574680000000000b863b2c206736574616269000000ce4eba68b2c20a736574616c696d6974730000000040258ab2c207736574636f6465000000c0d25c53b3c209736574706172616d730000000060bb5bb3c207736574707269760000000038d15bb3c20873657470726f6473000040cbdac0e9e2d40a756e6c696e6b61757468000040cbdaa86c52d50a757064617465617574680001000000a061d3dc31036936340000086162695f68617368000000012276617269616e745f626c6f636b5f7369676e696e675f617574686f726974795f7630011a626c6f636b5f7369676e696e675f617574686f726974795f76300000000000000000000000b085979b5caaf96c180792bea37b863e8b3401fe946ffa0668d97519e4db614504000000033b3d4b01000000040fe1293299472996f03cf30560d9279afc23397ac2c9e2bd8ebf9daa010000000000ea3055890000000000000000000000000000 -DMLOG RLIMIT_OP STATE UPD {"average_block_net_usage":{"last_ordinal":3,"value_ex":81866667,"consumed":9824},"average_block_cpu_usage":{"last_ordinal":3,"value_ex":384993056,"consumed":46101},"pending_net_usage":7920,"pending_cpu_usage":4100,"total_net_weight":0,"total_cpu_weight":0,"total_ram_bytes":0,"virtual_net_limit":1050675,"virtual_cpu_limit":200400} -DMLOG RLIMIT_OP STATE UPD {"average_block_net_usage":{"last_ordinal":4,"value_ex":147184444,"consumed":8002},"average_block_cpu_usage":{"last_ordinal":4,"value_ex":415951447,"consumed":4482},"pending_net_usage":0,"pending_cpu_usage":0,"total_net_weight":0,"total_cpu_weight":0,"total_ram_bytes":0,"virtual_net_limit":1051726,"virtual_cpu_limit":200600} -DMLOG ACCEPTED_BLOCK 4 04000000040000000300000000000000010000000000ea3055000100000001000240e54a7b27e042b80a810153bec1dd166eef95fa69f6c9886ae283363bc2add8010003000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d912d5b1b639d6ae94fcdd0536b224644931573d1ccb2a0c548613cd1feea18888b9f7a024608fe7c6a41fc06647552834ff1a125fa119c088556171a7c78be23410300000000000000010000000000ea305504000000010000000000ea305503000000000100000001000240e54a7b27e042b80a810153bec1dd166eef95fa69f6c9886ae283363bc2add8010000000000040fe1293299472996f03cf30560d9279afc23397ac2c9e2bd8ebf9daa033b3d4b0000000000ea30550000000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d9124a405bf28429701bc7daad6eee3c8e0cbd102e2100c1c49bc26f42ebce3147fe5fd364290bd2ae66d14935b5be2da8e14e91e76cede8b276cbadfaf82254f590000000000010000a105151a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b7241ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea994a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0fe0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff52668dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a297428ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c438ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a4052652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d674fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c2299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b4476707c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead450715443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b4bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e99d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb406bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc35c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b98c4175db53ed27e7911a1b5adf0e7db0fc96c2cae172cf594dfa9a742ca9e88fce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb409e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc16001f7a148bbfc187329da8208e033688ee6fc723cc2660421e16cc823bf15eafae6613c3cfcad3b531904d0344fdec218bdaf38167b523c6b63d432e08ca8bf390c30000000029807708239aa7de914d3ed61e9009ab2280bfbc50f1d9769f27f8341ef261980000000000011609e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc160ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd1a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b72412652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b447670735c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b4a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0f4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d674fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c25443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b468dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a2974286bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc8ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a40598c4175db53ed27e7911a1b5adf0e7db0fc96c2cae172cf594dfa9a742ca9e88ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c43bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e99c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead45071d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb40e0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff526ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea99f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1dfce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb40001033b3d4b0000000000ea30550000000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d9124a405bf28429701bc7daad6eee3c8e0cbd102e2100c1c49bc26f42ebce3147fe5fd364290bd2ae66d14935b5be2da8e14e91e76cede8b276cbadfaf82254f590000000000010000a105151a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b7241ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea994a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0fe0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff52668dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a297428ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c438ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a4052652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d674fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c2299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b4476707c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead450715443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b4bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e99d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb406bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc35c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b98c4175db53ed27e7911a1b5adf0e7db0fc96c2cae172cf594dfa9a742ca9e88fce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb409e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc16001f7a148bbfc187329da8208e033688ee6fc723cc2660421e16cc823bf15eafae6613c3cfcad3b531904d0344fdec218bdaf38167b523c6b63d432e08ca8bf390c30200d0070000dc060101002049fcfe3e32a8418a4f102accf23ec30e87b2a493529dbcd4db418e7a0c92240e6eafd57d3201ef0cc66c93d5abd00a70653e9231b93bbccb781155ad5294dde50100b03578daed3c0b90645755f7f33e3dfdba77df862569665773fb31602f6e641236b3638866df48f64312126240fc31db3bd3bbd33ddfede959762ddc5ecc162e1fab505192602950c19060b02a501442616d22a922a8652009452cd1685925454463690952483c9f7b5fbfee99091b3a0954c9243b7ddf7df79c7beff99f736f4ff88fd19bb5f8af2f7e789b801f89bfc4d7c7df00bff7bdec9df73d90ef101ff9c61557fce5edb9ae3f8787faea22f6c8dbe44b0e0b715875bbe2b0eee26fef34fcc8ee61214f1ff6baa74f4397dfc51fe8d3fca1b2dfa7ed3b71384030ea97a701df698709d09ea681127a649710232cbc00ec342d8fea12082353d0a39ef2c77463e944347b64fa68736976ba39b14768ec293596579bcbd3f5d5d546bb232476c5336bed7663a933dd6ecc349a271a6de161b75f3fb20c4304b6cb3c7e7a75ae7ec595134211ee5edfe5dc931b75e5e557705f6cfbdacd95c6e2ece513e3dc1de4318d4cc37ae6163acd57091f9fbd1eca208f6b640049040b5e86f54ecf374e89007bcc6aa3337d646179667e66aede5c9a5ea9b7eb8b8d4ea3bd0acd99f9c62cef38586c2cceac9c1221c11cfb5e30051c7631a25e692faf2caf3666b131bb360363c40851d591b0d35c6c30f9b623dafa4c07089a1b4da80a2bede65267757a8157739123516e3745c20adc5bed2cb71bc4be88bada8de36b4de8a9af75e64409bbb6f0c29a279a0b8d63b0da3276be083bdb8dd5e5b5f64c637aa1b9d8ecac8a2df8e6251bef63ba71526c25c8957683965def34a68f36ea9db57643c444355e363f6c6faebab7d36ef8acd8c62c87e7e5a5e9d97aa73ebddafcb586b888ba01efec74ee1d13635b5e20a76796671be245d85f84cd230971ebc4a73274acadcce2b2b06f7b8f9273b076a9f75f2b5ebc2d16dbe2382ec505155f5c50854ba48c65857f0ad27ec84a013f45019ad2fd53055950f053f07cb922cb655f4b21838b7557a667ce8ba82bd27f7a30fb0847a45f5f595938255e36729114a98c4a6f78e32ffce22ffdf2afbe797ab671b4f8d177c96b3d11d7a2af6a61447c593c668491aff7f64d9d39f33f8fde7df6f6bfbba36b143c6377fc6a1fbaeffdf26ffddefbef7e43aff76ad7fbd12f7e41f4ba7f06bbcf7cedbe6f9c7fe45d391c3f6b477fead3ff714baff71ae8fdd61f3ffaa58f7cf091fb7338f6118e338f7eee438f4ff57a53ee3df3cddbf2bdafe1de8f7dfbefbf7e676ebe6bb9fb93dffc727ef07eecfdd47fdff9be3bf2bd0768ecf9dffd76dfd883d4fbfb7ffde4a3f9deeb19efdffec9fbbffce9dc74afa3ee87effbf8676ebfa2d77ba33ff59ebb1f7ffcabefbebd6ff04dbe11bc95f39fbeed3171b3b72fa5e7c71ff9f8377ee3df456ca2c11f3f37dcf1a96fcf80e06dfd0852115f1eb5a5ee2a98b42c52b115ba525153ef86e7343e91c856a226e0897bcfee4bb411ad746b2b5d399e8809e8004095c61d23ae437068cb168e37121a5519c16bb94fa4dd03f8367dcf7911cbc8e848896842caee4b618ef904de4ca81200c30ca59a123df467f6612f4e938a6b04e28d5e25551796268dd851956a9f06fcf1cb135196a9a8f21ad3445d5b9646815f2c892832220a507c7f22f241e785fd5dc4c58abdfa5c1abd8e17f284984fe418100e96fe15019b285033869697b5f0b5885f394a8f46d6f015ac783ede023d4f88d698883e54801522396b80017e79899a4fc3d7f2feef87fd5367554546014c21de3a6a68e75e5a205a7bd8dbaa6a8702a0f5c6d03af572d05e065d1a0a3a1e0a7afb50d095a1a0770e056d86821e1b0aba3614f4eea1a0c78782de3314f4e450d0570f057d5ef483cbcdc0550e5c65e00f00b8fcdee072001c8145f46da965579d26bb333e9f68323b3857dc8a0b53a2eaa571150d9a82b60f260e5f18d5aa060aed2de03c5416c69f2abcdd7826b85c88b389373579ee6cd587775d5897f1e05dd52bb1fd4de57e5adbdd6c7d0172af06d3e460f76a81d3a1bd6f5505ce8eb34664ca13951a30dd8c260634bde935c0e37cba939e6cc523b0c6426b970648a3f1c3c389bcbd1839d07c60f541d4c03e82e97f1f8425900f78b8fda704ef5f8302a21f80d614d8e50a7c74f7ea18a611802ef170c99a10120d3cd8227ab73bfef513ff7639b800815ee420ad0f20e2572540ef71a379e3e71f60b7638077e3f89ed612ef61fa78b17a3d0d7be75fe030108c785722701131d0a4d64a7c6cc33e608549e0da955612dab6d1881658884f88d928f00949013f3c53988fc78150d80f40b0171c15f073ec9e4324daa4c5b64b8ff3ce694c0d6466ce3e4ca8c33c8160c7618714da136a169ae080888bf195a38ca790a79125a4c51a5f9cf8136a0f911246c6b7204ba74e0359e55be1d7afbf7107ac01692668d28c0b483f00dc4d5cd035b53351f8616e0478856f62f8606ea504aa0c7315e4a9021bd859424e40d3ae97b6a3c186c51311223a5c150e525c5b46c7fd8a8867aa24feb565d19b17e4ea00aa4155004a8df1ca5c0bd90e6a6328a44061508843010e60814049264c55fcc4c5ee24fc30e153e4bbcf067ac4e925c603aa0acb1ee33905ae009417dc0c72d7276580697d10ff1a0606fb21e80095c055e0c24a0a620f78de8f6b844e5c584012c7ff81eac02ae36ae2a75db61dff89628ae4f1d3b77987cad8885f5e0d53592d602f509723a3f9241c83f155d0290992e3c7d55116da8085d6ca6880841f3701d0da768000bb568d5b0ad71f52e8963efe39d292c0842c5c2186219ee21da697f60d42f9af8e001e301945201f1853e3a506c0c07644604e7c52e8aa4ad99c94c888d1a856b54cdbf7d98c94d08a45a64c562c222b56827760c57c13a1158b584b7d67c53ef920ad4099120a9972b06cc57c0c465b6437239c16388056cccbac98efac989d1ead16a0c0297b868cd41296811a548d70ae08a9c65346a6882f0cf614111a1e6afc40426d726a5e44bb4d5d714ff325a81d485f30a10c7ea05e017ab45bf066a793b59d894f1607c40655cbc797317c44996a19780a50b550be32d51aa1f92cb135082be815602ca01e84100493b2127b1805f6fbac0314bf9a20ba4d6905e699b4c08075ae82851823cb8f3655301b3e4bc652ed8b159906b6a04f52a791ec073cb683f42b606318a031c47807f8925109632f788e7bcf40480f684f0fd822b1a6d05421eb68029ef10f591e757a538bdc089ab71a05ef1e9a65b43b36c8f688d7e87f615d682161377ba650026a71425885358302cca08f66d0cfcc200810da872fe99edf06ca806920174f3b49f4d5e2128ee9e9d19b32e7ae161aade1540d5a8a5ae3d092d49a8416826b1af7226cdd05b6a070e22a7131e97a0cad1753ab02aded080403ae1221f5e1b8201be767e33c5c02cf3ff9769cfaed9c159e39ffb4b8f52c74546cc713d7dc4a61023d3d75e9ad67f165e11c3e7e6b2bbeaa60fb3b2101d5a0fd5d7d2b2dfbecd9b3ac79304dfc3c4f53210221d1b6510b097911b5907c715f9a25e7d34bd9909e7b200bc2501ac126985c1066480814711462b13bb4f4bbd624e37bfc05d49b4f2b8bc00e301e41fad1c7ee790cb530bd071bd5d08d0521a3615efae83d8fbd020c246837d89b4e1282590e0eed48425c0e587041b11858d4ca42bc0b432349de005d00ca287a8dca4202f99f44f514a8e9b06a927bcc42031e84e02d8af1c0f80636b7e4e586ec7c0a2d703455a931270737e4e12c1034f12c921502e5135eaf406c97e91b4697d04d53e3f31cc590e04743e391d3a4292d49439a12760401ae8877c3db90a33d1fd54ee06a3d8c86d80103063018b0a21057142224382de79e259a1f89e607b687335140869d1e74460f2bed394b1493bea5b821f2ee3015b8308525075e359283d3f1c49f4ffdb57bab01791d09713ef8c4f01cfac79b71378a286179eebb052a6b20d024600a4d569588fb8c98d2b7124c9876f79795454dda586ac5af1f251348b82078f42d35897ebea526901136e5a39c808cc4378b88431cf4ece0e96f28534c68c2f9f8e72c20455026bc91de802547798e38f8f2f8031780d8914aa0a7f1cf8f925f040bf6a75aa105ebd92f34def125cfb11913991913991913793326d88c89cc8c89cc8c89ff7f660cfcd18ef4b39039ee045efd74fa196ab1818afea0dfe570854a585e29e4153e32afb4e595b453286a31afa49d8c324dcb2b68dd05c68b7925d10513afb0c5bc92c84c0f79857dcc2b37cecfc6792eb7d048443d4844dd4744dd4f449d23a2ce11516744d43d5ed134f1f33c4d8508c4bcc216f30a5bcc2b8856e29752cc02dcb9eb4701c10f5b40a0e21fa320e02bf7739ec08cfa33293de7457a491d84af3f9e78655b732860c5859c00d958ae33a467bc43e48e5e5e559c85792e0b0324f41c5f3a6a115860180239958c7af912e6259cb1730286de9662592f3d793c2d1cc8e7563a1bcb26fb3552c3ca71d9bc5c97045fe0d2220cde7f846403240f299689f13e9960894051789632600b4c63fc81b91df4b7b0ca52b3352dc295cfb631daab6132565363582fa4ba88e33e0909961bc7284a51079e09ee1284930e4e3e039c05b8780080169e52e899c932e59185563c35ca35974242e514da5f89ab2ab6a8f7b4b4153d5bfa84dc5b63d4abe97c8862e543b48c5b1fecab8f5e262810e22553e088a1d2d3e23810ea69793c519d7bcf226bd2b00559685045a376461e2fdb2089623e9f633e05c112b92b8c8b30187611938781367ef040662184a53794b9eaca3cf22217d307f348b5f9c4bf314738c683ac0e205dce9209e3db8aee6daa2f8b287060ee257adec843145e023dae12c22521b05dcd85e42e44fdb65aa45dee817bc2c4a37b7d59a64fc34f88824ea484972afd2e7469ce3714e61b1a0b09906f68125c6d85d7684836b8888df902d00e5282aaeeadc546b46e0d1884f732200913cd53fd07a63888e28fd4a2ad53101f71a85fe0fa2746fc1e85e12ea2df6ab383fb94d2201aa06767e473aa68b7f0c74d56d126d49b58720f6ea866b7b0d87f5e0c2818e141b9dfc7d093f0f430954e2651f04901a8ca83bd9c23a16eb9422f9718f42e7d53e273895aeed5a8fb5cc3c6d277cd963b77e9838cf50ad6a6c99c365dedb4e98c4475ba7e48f3061b7fec3c6d1c3aff462a8f19f083767e39af37e0f240bf33738445b7c0e8cb04a4950673134caac581b8e21ce23d0a36e4b91c66b30d55ec862adfef862a16f87b6dc8b76e3c59bf2bc8ab7d37327623e3814185dca08aa34f659390002b6b01d388ce0ce26a013f2ad51122d5882960e9217e09596fd8d107b58cfa7d1c9a65a254564df72d55b0daec0d549abd31320bbe553b50f1edfc11f30110e84f85f5a7e0621bdab68e0f8dd28ad88bc47ba7480b0d9e3f800f0233168f5aaf6248be19eb18e5fddc2f922057eff7c0ba0758ef0f688d585000821f6e613506c9df4a0a7875a08be5762f5d68252388a188988b96f02bad2422fb6a8a9cf17be9c18c7d2dae53961883e692e4c19629a5aa939e7b50a0e26f932822691795de07e12cd209446446282d8f4c648af40a55b9c0c378d15475a53331cde5112fe73bff4a53b97524974390b7d174104807807caab59113d5116a0aca049b73f62ae02ac989fae4447d74a258630a519a35d630d639d130573849024c2c34fb518d35dbd7b203c502051e5dddc0157498d0ef00dd4d682b3c89760cd148d0918c211a1952c409226448840799d0090cc1fb1ee0bea2fdd6471e6cd97700efe3bb3263505c5c0786940719e233a503d85764a95da4f21a96f5237a85d41e710c29509d09b6564052811e454c045c47e84a41824b279acfb3b830b49db498943ebe8e440421185b564efca34017819bba57b2eac5049a63020f89ecc202ac832756733cfb01b3b856a1e5944a70a9df9630136f307ac8ce95acff76ac04990853ccc3a8820981c335a8ff2451fe3c70cc5fc370028f77a85aa7536f2d41090a219e60ff8c42a8b1dae7393c1adb7e07c20b4d5601e5000d1108164ac408067ebddd545a9bef0bf752f572210851a8c85b08b0a21698e27c35623d00fb06318c44e108989d45ec40b1e3131b4945468e6e24f4e2898db0f294932689a2b785cb871265732b93770b09a52d836e65b1dd9255453b2881b03d697b9058736e7460ca3c8a11116eb4083eac22b16602d68a769a43528aa2ca256dc324bc9404325cc6b0aac06195c761d508974a610216ce80ed5ee0ec56d86ff770bd091f9dd20505b27b5bd9ee899cdd930e9e4cadefd4ac60ed9e3fa8669a092eab54dca50d6db181e0563ee2a53a6e68b5d1945931cab89232beb115c82f488a0779ff2a533d8cbcb5d58ec1d8cdab7aecaadda137df969ae05015ebd484433aabe967a987c6377d5653e6ad2619b8cc6ae2815b2ff5f0d06a92f34701d5547666ab4959837f577c387a87a4406df0acf8f9886c6d500aa6e706e758a1fd53eed86e936b67d70da6308acf432eecdad946d0188a5cd8b5b367071d0f05bd7d28e8ca50d03b87823643418f0d055d1b0a7af750d0e34341ef190a7a7228e8ab87825e77ed6c33f00bbc76b699866f74edecbd3f2c4550485fc882914378b7e77b1431d983bea73631a61b2ec71f588e8fcbf1d9984e51aae4aebaa471956fd865514876d10caf1710defe4b2e3e5e5609ade9f5f90c19cff130d241f91db1975b8a14b93ecc975b78898a6f9714f1724b6022badc12d0e59622261090e599002fb7f085204c7dfb2eb78c98221272c4c1bae58fa0991cc17de1b4eb2eb72877b945b92b7a103cc1c3e015bda2cd2371a20029c1f371c6ca8176feb29a25dac095356dafac55b8c557d6a848020842ae90fc33d0a4c025129faf91c9bdfa4d5c1db929f369712b9eccae607d5e6bcf9da8fcd048429f0810ef7dcbfb30cffb429ef721f3be90e37d7821bcf74d88bcf71dac5bb04f1504cbfbf082781f6ec0fb30e3bdcfbce7f986e7bdbdbe7a55c6c9c7a4d6fd87f79c6a6a8ed620ce9b5cbc978fc105dd59e0af0c181f0fd87d7bc0eeee11f03d451bbed6d47812dc4b09c1e630eee261e00ee615a57414e0422744b7dfb9df45b76c2805da5902f5c04560a5c2e57631e5765be9749ebf3ff05d2e78eb81cdf1b701e8f201277b9409e9bbf0621a88172c1264ec66485ec20ed7b9db5789adb9cb2462dd05160fcb2f0a855ae62cbab4096060efe65208cfe40d8848399ce1c638fd812090930d1fa3ca5b46dd7d8500ef95304c294f8ae8ab928a162ab77fae471879a58a39ffe35d7bb86b6ff35deb8d76add907aedfb5eedf75ecf2398f0b390ea3de18a31c70ca76cff19b4607987c090b04a5522c1a55bce5b169ff09255d4e430562baf69126adc4a68eb5d6954a4c41eb323196cae33ba80a2f5076454f2cf84289bb195353351a0ee9ae3c81727e7c4742c5753cd517346b74bbee5da45e2f85a85e2fa0143a390c590ea52d0a5da9c6f9cce119a7df7221d36fd97c7aa7ed21da066fbdca87a0d3a0f29f782053f9108348bf2f63f2b26bfceb9565201ca3894334132127c38366621632c39eac50608665143459781ce3e562b8f5fb55ecc906364b2120a7ab6995e67c4126b947be00b3808057fb03e34d50e90154f6b2196442f1af8c46ffbbde2cb14240b60f5381226954a47babb672a05f203b6557e0e30ae0d7f124d841f5772a4f901333c10e2ae9d8b98cffba0de7dae0f431679515fd3f4af6832d0dcd01a91ab00e2fd47dcc1e791bfad205872b549fdd9efbf2852af1a997d7eef1d6551436ce76f84ae146b6d58beba3fda69a8e6ce9d631577fec999aa09bf264150ff22188c0e2944775405745aeb4e835bbef7c71cae3aa93aa0a7be21d71a1879221ba9748e76b92528fbdae4e17f365483c4681be12e52a1f78d0467c747cf29b5c9bf7d6b9b917b2366f0fb843b4e8eb6bf347ece1765f6d1eb396c905accd5baafa48556d2ff32701e1cb95fcf03598b301aada1aab8695155c309495cdfd5cd9dcb1cee87866b44f64828d52d400e9bb87d8b82e4bc51352c4d86f53a30ffab2d45f525f5f549f5cec15d5c7b9a8aeb8a84e211d45ff2a2b48abac20adb282b4e28234b7fa4bee931b94dc73a576e20c95da3ffc3b0f8ddd5896e99df099abb4e3089dfef643775e84e7f6c81fd9d9b0ce2e519a27177ab575e0a3adad23477bb5f5ef6b534819d79aecabbc6717a05df59dbe5db351319abea2e2aaf292aaf264c87b55793ca8b16578405ac4d72477a5be131d72cb7e76a6f35e2b79543d2e71593da2fbb530e8adad574af16a70dbe829003917a0ddea38f2748bb4b76b695936f9cc1d2f79ee788964d756ce159f2d89410d90bc1fc46e2fef46b9af4cb074ba8b0effc05f9bd0eeb875385b11aeb7159a6d85665b110eda0ab40b7cff832f33b77afe243c30a882217fd167c06b85836ed97ee9031e2dcf6a2d2a990f92892fab0b6b57c7f92b1d7826067be2b318bad8c469a5c8ae9cc7bde7021facf173896e97c044f131a4f238db80ebe9bece2e6121369b410ccc200666a0e7e716d94929bb844ed923258bceca6c0f9d7befd0b96787ce3defc6e7dd7c36c377f701f7d85e3566146aafbdaa25a27ff1f800e2bcc83974d4684566979fb72821edc91a7f218b54a140258b2c0056073670ecbebb943110b9d9da439f886447bd932dba92bc4e44c8f512f16426221467f4939dbafa0585bafa65c55ecbb1e2a2d8a1e44298ddcfd77601d5ae7cccbb111e6f1d1e369ef835c744c573a3cf8e662411f4d5552762637dd4cb4b598e7a6a3df5d47aeaf5c4cd7dff63200e3a4fc59c0fe0b76472979c91d4151246fc962c09335d136489abe15939847c899ee7cb1d889db9a3dcb9efca8d65658b78c5ebc804e35767500c80786d8e67d097e19f8208c01b528ccedf70086080fd9605987fbc0be293f54460fcca0e7dbd8daeb679a80b5e996e09b037e2d01852efe3141923e570268cc3ddb1b198b0f1ba8b9fe15dfc0a7bb49b19bbbcde66847b4ef0f36d1ac947c84cce984366daf076e77c8c4d3721b6fd49704c4ffa9afec24674ea68bdb9d098359d65535f58589ea9771a66a57eacb12ad6961a27571a331d78d968b797dba6b9648e364f3666a78f9cea3456cdccf2d26aa7bd36d3596e8bce5cc32c2ff130fe733766a6beb4b4dc31471ad05ac019669b6dc0b6704ab89ff41df78be871cf3ee19fc7017c8dfaa2a9773a8dc5950eafea2ded262d69b5637096c6d2ac280afb67780027acb463b2bfc67395112bede5cef2ccf28271639aab0617d2fb8b3dfc07b014fcd3cf6e5e816bf5e15f00ff968fb4603b386095016078bb0ec498c636cf09145b5c5be834a79b4bb38d9382e9837f13a8b9742c1b2f2ca566e005ccc8785711b6533fb2001d474d1ddecf35da48f24e1b36b27ef2c5e5d9e6d1539bcc6b27b0632e6802feab436dc7c599b9fad231a046bbb9586f9f32f38d53e62d738d258b1277535fb288372528eebb9f9ec71a1d2142a06501fe8dc0bf22fc8b04fe2916219a4b27ea0bcd5973a2de6ed697704fb895672394606b23ef6b09e0fa3f2ca2750300d007000082010101001f4f75ec37abff1e4bda5befd6530f4fe3e1a349fbf2a7bd5b79287804ad8dfe02249cfa799b23f75177e7876879e32b9e00d471001e7c18c4005c88fb5ed882650100e60778da8d563b8f1c4510ee7defeddaa7f38139ce0181118925c0b736ab93a323202120e0111d66e89daedd69ed4ccfd0ddb37b0b31812141223312b2100f07179d13eb20b0364542b2c1091000194864fc00aa7b666766e7b8e53a984755757557d5575f77ebf7ee3b35f2cfc3af2e101c15f3207f5d7dcbbceebb47f325c1ddbf7bbd4f3717925b9beb102a1edeb84107fcc59d177a95ad811fba6347f191e062e4d0587ba1e47a76794225a7423ba7e89dc9d5ed363a713caa3c526d845301b22e68007523e9ba1eb8631507bd97fa6dea6a3ea11a48657d0854c7121cc647a074d16a2d734dea6bda93a0bcd067cd980b7dad571fc34c9dc38733053ef2f4fe4d74ea86b1d06a3b021970854109c78709f89949634ab956e7cd33935d3a3d1c523dc3b217ed7cd7a35c38119518ae06a9c88527027a90a64a8076624547609df4af5fd2548e4097b54ee4ea74996d33594b2a94c914c6b1ece25aef9901553801e44aab8ddcb70f30a5b354feac1b0a0d07da194a3099573671859d883838ab2903919a162276a3786923cb1167da5511975d6c0798e055064f973df87c089a0759ca180c414a606874e0c041c425b576532e58384dad2e96bd30f0b3bc3d65945cf85c8093aa157f7fb1c0d6492d83487b56bdd3b7e9c9e15554755d2a5cf0ed52a4ba9efc2dd0b8518673d3ec9fb362ab74702ae2ce98936a2b6d04db7b9d7c76f29f6397546bf8d389e281cf5d073f9b893cdd541b7730b61eeb4b1eeb6ec820f9d2b328f9ea4a782fe61202582c2b106ec9249cee4a6cf2302583ec913044dee54dcb0a900b5a21ea6528b10f15088660e7ac6537d7db6da3449b4a3606330dea44929080d05dba6639095ba73004a9162c4fe67d293d9b910c59ece2a6729aaa9ecf8459947938a711eb394cde8210d94a466c194b53914a7d28c3c0fa6f2ad0c8baa5b2d7509464a663f43e0f90f84a855c43b272ac4dc3d252c7347512632a302d5614b4d097a97ec95173121824344c6276d726c1040910b396fc5bb8245bc12a6a4b918a549ac9c77fb3a75927927c520aaac59563c489e3b6350a193a6b2b4c128b7d78f26451f66f76629141b9f6bf50eec411a3692bd557b692096181f7bab1cf4bdd2d1c31a4dab67f0adc94289681b48107f195cff050ce4f45f2ddad2baf7cf8f5cb4bbc40f6befff9eee117af167b1dc7f3e3da371fe7bd4af63ebf7d99ddbf5d6c401cbf3dfae0f197593f7df266ff176087c7cbc8c3710782c3e30c658bebc3026284fcf0dab177342f420ac7de731f1dcd336810f2e0d1db6fdc9b178a8de3dd6ff7efcdb3b2e2d87d8882bc8426b8077ffef153b1563660fff5c7c58a989bcc1dfae3af3b35debf4e487edfc05bcf192e289555a73df9171ffd59af0001 +DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304003,"value_ex":102738,"consumed":7929},"cpu_usage":{"last_ordinal":1262304003,"value_ex":291109,"consumed":4101},"ram_usage":199629} +DMLOG APPLIED_TRANSACTION 4 5ecfddd3ef98258eaf45e9bbb378bacd091dfaf25891b15b984a4229d765b53504000000033b3d4b0100000004119dde5dc2ba60b1c4f1013a50ea81abfa00d53b1c9bd42d37f5a79e0100d00700008301000000000000000018040000000000000001010000010000000000ea30552deb8b0eef2f2bfd027d20727a96e4b30eb6ccdc27488670d57bf488395c48fc1c000000000000001c00000000000000010000000000ea30551c0000000000000002020000000000ea30550000000000ea305500000000b863b2c2010000000000ea305500000000a8ed323293120000000000ea305589120e656f73696f3a3a6162692f312e320117626c6f636b5f7369676e696e675f617574686f726974792276617269616e745f626c6f636b5f7369676e696e675f617574686f726974795f763019086162695f686173680002056f776e6572046e616d6504686173680b636865636b73756d32353608616374697661746500010e666561747572655f6469676573740b636865636b73756d32353609617574686f726974790004097468726573686f6c640675696e743332046b6579730c6b65795f7765696768745b5d086163636f756e7473197065726d697373696f6e5f6c6576656c5f7765696768745b5d0577616974730d776169745f7765696768745b5d1a626c6f636b5f7369676e696e675f617574686f726974795f76300002097468726573686f6c640675696e743332046b6579730c6b65795f7765696768745b5d15626c6f636b636861696e5f706172616d65746572730011136d61785f626c6f636b5f6e65745f75736167650675696e7436341a7461726765745f626c6f636b5f6e65745f75736167655f7063740675696e743332196d61785f7472616e73616374696f6e5f6e65745f75736167650675696e7433321e626173655f7065725f7472616e73616374696f6e5f6e65745f75736167650675696e743332106e65745f75736167655f6c65657761790675696e74333223636f6e746578745f667265655f646973636f756e745f6e65745f75736167655f6e756d0675696e74333223636f6e746578745f667265655f646973636f756e745f6e65745f75736167655f64656e0675696e743332136d61785f626c6f636b5f6370755f75736167650675696e7433321a7461726765745f626c6f636b5f6370755f75736167655f7063740675696e743332196d61785f7472616e73616374696f6e5f6370755f75736167650675696e743332196d696e5f7472616e73616374696f6e5f6370755f75736167650675696e743332186d61785f7472616e73616374696f6e5f6c69666574696d650675696e7433321e64656665727265645f7472785f65787069726174696f6e5f77696e646f770675696e743332156d61785f7472616e73616374696f6e5f64656c61790675696e743332166d61785f696e6c696e655f616374696f6e5f73697a650675696e743332176d61785f696e6c696e655f616374696f6e5f64657074680675696e743136136d61785f617574686f726974795f64657074680675696e7431360b63616e63656c64656c617900020e63616e63656c696e675f61757468107065726d697373696f6e5f6c6576656c067472785f69640b636865636b73756d3235360a64656c657465617574680002076163636f756e74046e616d650a7065726d697373696f6e046e616d650a6b65795f7765696768740002036b65790a7075626c69635f6b6579067765696768740675696e743136086c696e6b617574680004076163636f756e74046e616d6504636f6465046e616d650474797065046e616d650b726571756972656d656e74046e616d650a6e65776163636f756e7400040763726561746f72046e616d65046e616d65046e616d65056f776e657209617574686f726974790661637469766509617574686f72697479076f6e6572726f7200020973656e6465725f69640775696e743132380873656e745f747278056279746573107065726d697373696f6e5f6c6576656c0002056163746f72046e616d650a7065726d697373696f6e046e616d65177065726d697373696f6e5f6c6576656c5f77656967687400020a7065726d697373696f6e107065726d697373696f6e5f6c6576656c067765696768740675696e7431361270726f64756365725f617574686f7269747900020d70726f64756365725f6e616d65046e616d6509617574686f7269747917626c6f636b5f7369676e696e675f617574686f726974790c72657161637469766174656400010e666561747572655f6469676573740b636865636b73756d323536077265716175746800010466726f6d046e616d65067365746162690002076163636f756e74046e616d65036162690562797465730a736574616c696d6974730004076163636f756e74046e616d650972616d5f627974657305696e7436340a6e65745f77656967687405696e7436340a6370755f77656967687405696e74363407736574636f64650004076163636f756e74046e616d6506766d747970650575696e743809766d76657273696f6e0575696e743804636f646505627974657309736574706172616d73000106706172616d7315626c6f636b636861696e5f706172616d657465727307736574707269760002076163636f756e74046e616d650769735f707269760575696e74380873657470726f64730001087363686564756c651470726f64756365725f617574686f726974795b5d0a756e6c696e6b617574680003076163636f756e74046e616d6504636f6465046e616d650474797065046e616d650a757064617465617574680004076163636f756e74046e616d650a7065726d697373696f6e046e616d6506706172656e74046e616d65046175746809617574686f726974790b776169745f776569676874000208776169745f7365630675696e743332067765696768740675696e743136100000002a9bed32320861637469766174650000bc892a4585a6410b63616e63656c64656c6179000040cbdaa8aca24a0a64656c65746561757468000000002d6b03a78b086c696e6b617574680000409e9a2264b89a0a6e65776163636f756e7400000000e0d27bd5a4076f6e6572726f7200905436db6564acba0c72657161637469766174656400000000a0656dacba07726571617574680000000000b863b2c206736574616269000000ce4eba68b2c20a736574616c696d6974730000000040258ab2c207736574636f6465000000c0d25c53b3c209736574706172616d730000000060bb5bb3c207736574707269760000000038d15bb3c20873657470726f6473000040cbdac0e9e2d40a756e6c696e6b61757468000040cbdaa86c52d50a757064617465617574680001000000a061d3dc31036936340000086162695f68617368000000012276617269616e745f626c6f636b5f7369676e696e675f617574686f726974795f7630011a626c6f636b5f7369676e696e675f617574686f726974795f763000000000000000000000005ecfddd3ef98258eaf45e9bbb378bacd091dfaf25891b15b984a4229d765b53504000000033b3d4b0100000004119dde5dc2ba60b1c4f1013a50ea81abfa00d53b1c9bd42d37f5a79e010000000000ea3055890000000000000000000000000000 +DMLOG RLIMIT_OP STATE UPD {"average_block_net_usage":{"last_ordinal":3,"value_ex":81866667,"consumed":9824},"average_block_cpu_usage":{"last_ordinal":3,"value_ex":384993056,"consumed":46101},"pending_net_usage":7928,"pending_cpu_usage":4100,"total_net_weight":0,"total_cpu_weight":0,"total_ram_bytes":0,"virtual_net_limit":1050675,"virtual_cpu_limit":200400} +DMLOG RLIMIT_OP STATE UPD {"average_block_net_usage":{"last_ordinal":4,"value_ex":147251111,"consumed":8010},"average_block_cpu_usage":{"last_ordinal":4,"value_ex":415951447,"consumed":4482},"pending_net_usage":0,"pending_cpu_usage":0,"total_net_weight":0,"total_cpu_weight":0,"total_ram_bytes":0,"virtual_net_limit":1051726,"virtual_cpu_limit":200600} +DMLOG ACCEPTED_BLOCK 4 04000000040000000300000000000000010000000000ea3055000100000001000240e54a7b27e042b80a810153bec1dd166eef95fa69f6c9886ae283363bc2add8010003000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b442d5b1b639d6ae94fcdd0536b224644931573d1ccb2a0c548613cd1feea18888b87ba6ee368252e66e0c9b4d234cb5031b8963705c169568543012ac702e7c7ca0300000000000000010000000000ea305504000000010000000000ea305503000000000100000001000240e54a7b27e042b80a810153bec1dd166eef95fa69f6c9886ae283363bc2add801000000000004119dde5dc2ba60b1c4f1013a50ea81abfa00d53b1c9bd42d37f5a79e033b3d4b0000000000ea30550000000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440fb1731b78038b7fd1e418d83062417a2c12a515dde5d4d8bbd2610bb46ce01b8888fd15e295bb3585742c5737bf6bd6deb93ece7f776af86767a2bc20834cff0000000000010000a105151a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b7241ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea994a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0fe0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff52668dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a297428ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c438ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a4052652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d674fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c2299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b4476707c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead450715443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b4bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e99d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb406bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc35c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b63320dd4a58212e4d32d1f58926b73ca33a247326c2a5e9fd39268d2384e011afce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb409e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc1600203f08f2be4e59753b3ce01482e4023e51b0971a7d71fab20cadbdeb96890e8ce66dbdee15bfa731a2353bfbfc345485ba643aea2d3accee6e6f426b8382661ae30000000029807708239aa7de914d3ed61e9009ab2280bfbc50f1d9769f27f8341ef261980000000000011609e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc160ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd1a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b72412652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b447670735c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b4a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0f4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d674fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c25443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b463320dd4a58212e4d32d1f58926b73ca33a247326c2a5e9fd39268d2384e011a68dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a2974286bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc8ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a405ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c43bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e99c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead45071d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb40e0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff526ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea99f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1dfce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb40001033b3d4b0000000000ea30550000000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440fb1731b78038b7fd1e418d83062417a2c12a515dde5d4d8bbd2610bb46ce01b8888fd15e295bb3585742c5737bf6bd6deb93ece7f776af86767a2bc20834cff0000000000010000a105151a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b7241ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea994a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0fe0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff52668dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a297428ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c438ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a4052652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d674fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c2299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b4476707c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead450715443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b4bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e99d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb406bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc35c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b63320dd4a58212e4d32d1f58926b73ca33a247326c2a5e9fd39268d2384e011afce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb409e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc1600203f08f2be4e59753b3ce01482e4023e51b0971a7d71fab20cadbdeb96890e8ce66dbdee15bfa731a2353bfbfc345485ba643aea2d3accee6e6f426b8382661ae30200d0070000dc060101002073f10e2efaca3f684759d38276323ab5b0d66cb39d52db8dca6f4fc7108b1352749fa40dbfad03e1eb209291d43125433ab1bede2575ef11919ede3ef81c6aae0100af3578daed3c0b90645755f7f33e3dfdba77df862569665773fb31602f6e641236b36358cdbe91ec877c8901f1c76cef4cef4ef77cb7a767d9b5707b315b71f958a2a224c15242454382c1aa40510885b589a40a50cb0809452c51b4ac92029158560952483c9f7b5fbfee99091b3a8954c9243b7ddf7df79c7beff99f736f4ff84fd19bb4f8cd7dd56f08f891f84b7c75fcf5f07bffcbdefed023f90ef181af5f75d55fde95ebfa7378a8af2e628fbc53bee488104754b72b8ee82efef6cec08fec1e11f2cc11af7be60c74f95dfc813ecd1f2afb7dc6be13470204a37e7906f09d719800ed191a28a147760931c2c20bc04ed3f2a82e813032053dea297f4c37964e46b347a78f359766a79b137b84c69e526379b5b93c5d5f5d6db43b4262573cb3d66e37963ad3edc64ca379b2d1161e76fbf5a3cb304460bbcce3a757e7ea575d3d2114e1eef55dc93db951575f7915f7c5b6afdd5c692cce5e3931cedd411ed3c834ac676ea1d37c95f0f1d9eba10cf2b846069044b0e06558eff47ce3b408b0c7ac363ad347179667e667e6eacda5e9957abbbed8e834daabd09c996fccf28e83c5c6e2ccca691112ccf1ef0553c0619722ea95f6f2caf26a63161bb36b3330468c10551d093bcdc506936f3ba2adcf7480a0b9d184aab0d26e2e7556a7177835973812e5765324acc0bdd5ce72bb41ec8ba8abdd38b1d6849efa5a674e94b06b0b2fac79b2b9d0380eab2d63e78bb0b3dd585d5e6bcf34a6179a8bcdceaad8826f5eb2f13ea61ba7c456825c693768d9f54e63fa58a3de596b37444c54e365f3c3f6e6aa7b3bed86cf8a6dcc72785e5e9a9ead77ead3abcd5f69884ba81bf0ce4ee7de3131b6e505727a6679b6215e84fd45d83c9210b74e7c2a43c7daca2c2e0bfbb6f72839076b97fac075e2c5db62b12d8ee3525c50f1a50555b84cca5856f8a720ed87ac14f05314a029dd3f559005053f05cf972bb25cf6b51432b85477657af68288ba22fde747b38f7044faf5959585d3e26523974891caa8f4fa37fcdccfffc22ffef29ba6671bc78a1f7c87bcce13712dfa921646c457c4634618f93a6fffd4d9b3fffdf8fde7eefafbbbbb46c13376c7aff6a1fbc12ffcc6efbef7fed7f77af7b9de0ffeed6745affba7b0fbec571efafa85cfbf2387e3a7ede88f7dfc3f6eebf55e0bbddffae3c73ff7817b3eff700ec77ec271f6f14fbdffc9a95e6fcabd67bf7967bef735dcfba16fffc357efcdcd771d777ff49b5fc80f3e80bd1ffbaf7bdf7377bef7208dbdf03bdfee1b7b887a7fefafbff678bef706c6fb777ff2de2f7c3c37dd4dd4fdd8431ffec45d57f57a6ff6a7de75ff934f7ee99d77f50dbec53782b772e1e3773e216ef5f6a7f4fce4e73ffcf55ffb86884d34f8e3e7863b3ef5ed1910bcb51f412ae22ba3b6d45d059396452ab642572a6aea9df09cc62713d94ad4043c71efb9fd8936a2956e6da52b271231011d00a8d2b863c4f5080e6dd9c2f14642a32a23782df78bb47b10dfa6efba206219191d29114d48d97d29cc319fc09b0955026098a15453a287feec7eecc5695271ad40bcd1aba4eac2d2a4113baa52edd7803f7e7922ca3215555e639aa8ebcad2a86d4294441419110528be3f16f9a0f3c2fe2ee262c55e7d3e8d6ee2857c59cc27720c08074bffa2804d14a81943cbcb5af85ac4af1ca547236bf80a563c1f6f819e2f8bd69888de5f801522396b80017e79899a4fc3d7f2fe1f86fd5367554546014c21de3a6a68e75e5a205a7bd8dbaa6a8702a0f5c6d03af572d05e065d1a0a3a1e0a7afb50d095a1a0770e056d86821e1b0aba3614f4eea1a0c78782de3314f4e450d0fb8682be20fac1e566e02a07ae32f047005c7e6f7039008ec022fab6d4b2abce90dd199f4f34991d9c2b6ec5852951f5d2b88a064d41db0713872f8c6a550385f616701e2e0be34f15ee309e09ae14e25ce24d4d9e3f57f5e15d17d6653c7857f54a6c7f537980d6763f5b5f80dcabc13439d8bd5ae07468ef5b5581b3e3ac1199f244a5064c37a389014d6f7a0df0389feea4a75af108acb1d0daa501d268fcf070226f2f460e341f587d1035b08f60fadf036109e4031e6eff29c1fbd7a080e807a0350576b9021fddbd3a866904a04b3c5cb2268444030fb688deedee7ffbc8bf5f092e40a0173944eb0388f85509d07bdc68def88547d8ed18e0dd38bea7b5c47b983e5eac5e47c3defe17380c0423de95085c440c34a9b5121fdbb00f586112b876a59584b66d34a20516e21362360a7c4252c00fcf14e6e3712014f60310ec054705fc1cbbe710893669b1edd2e3bc731a53039999b30f13ea084f20d871d82185f6849a85263820e2627cf528e329e469640969b1c69726fe84da43a48491f16dc8d2a9334056f916f8f5ab6fd8016b409a099a34e302d20f00771317744ded4c147e989b015ee19b183e985b29812ac35c0579aac00676969013d0b4eba5ed68b061f14484888e54858314d795d171bf22e2992a897f5d59f4e605b93a886a5015805263bc32d742b683da180a29501814e2508003582050920953153f71b13b093f4cf814f9ee73811e717a89f180aac2b2c7784e812b00e5053783dcf54919605a1fc4bf8681c101083a40257015b8b09282d8039e0fe01aa113171690c4f17fa03ab0cab89af869976dc77fa2982279fcf4addee13236e29757c354560bd80bd4e5c8683e09c7607c15744a82e4f8717594853660a1b5321a20e1c74d00b4b61d20c0ae55e396c2f58714baa54f7e8ab42430210b57886188a77887e9e57d8350feab2380074c4611c807c6d478a90130b01d1198139f14baaa52362725326234aa552dd3f67d362325b462912993158bc88a95e01d5831df4468c522d652df59b18f3e4a2b50a68442a61c2c5b311f83d116d9cd08a7050ea015f3322be63b2b66a747ab052870ca9e2123b58465a00655239c2b42aaf1949129e20b833d458486871a3f90509b9c9a17d16e5357dcd37c096a07d2174c28831fa857801eed16bcd9e9646d67e293c501b141d5f2f1650c1f51a65a069e02542d94af4cb546683e4b6c0dc20a7a05180ba8072104c1a4acc41e4681fd3eeb00c5af2688ee545a8179262d30609dab6021c6c8f2a34d15cc864f92b154fb6345a6812de8d7a8d348f6031edb41fa15b0310cd01862bc037cc9a884b1173cc7bd6720a407b4a7076c91585368aa90753401cff8072c8f3abda5456e04cd5b8d82770fcd32da1d1b647bc46bf4bfb02eb490b09b3d532801b53821acc29a410166d04733e86766100408edc3e774cf6f0365c034908ba79d247a9fb88c637a7af4a6ccf97d42a3359caa414b516b1c5a925a93d042704de35e84adfbc016144e5e232e255d8fa1f5626a55a0b51d8160c03522a43e1c1764e3fc6c9c874be0f927efc0a9efe0acf0ec85a7c5ede7a0a3623bbe7ceded1426d0d35397df7e0e5f16cee3e3b7b6e2ab0ab6bf1312500ddadfd5b7d3b2cf9d3bc79a07d3c4cff334152210126d1bb5909097500bc917f7a559723ebd9c0de9f947b2200ca5116c82c9056186844011472116bb5b4bbf6b4d32bec75f40bdf9b4b208ec00e311a41f7ce28127500bd307b0510ddd5810321ae6a58f3ff0c42bc040827683bde9242198e5e0f08e24c4e5800517148b8145ad2cc4bb303492e40dd005a08ca2d7a82c2490ff49544f819a0eab26b9c72c34e04108dea2180f8c6f60734b5e6ec8cea7d0024753951a737270431ece024113cf225921503ee1f50ac47699be617409dd34353ecf510c097e34341e394d9ad29234a429614710e08a7837bc0d39daf351ed04aed6c368881d30600083012b0a7145214282d372ee59a2f991687e607b38130564d8e94167f498d29eb34431e95b8a1b22ef0e53810b535872e0552339381d4ffcf9d45f7bb01a90d79110e7834f0ccfa37fbc1577a3881296e7be5ba0b206024d02a6d0645589b8cf88297d0bc18469f7405959d4a48da556fcba513281840b8247df5293e8e75b6a021961533eca09c8487cab8838c441cf0e9efec632c584269c8f7fc602520465c29be90d587294e788832f8f3f7001881da9047a1affec28f945b0607faa155ab09efd42e31d5ff61c9b3191993191993191376382cd98c8cc98c8cc98f8ff67c6c01fed483f0999e34ee0d54fa69fa0161ba8e8f7fb5d0e57a884e595425ee123f34a5b5e493b85a216f34adac928d3b4bc82d67d60bc9857125d30f10a5bcc2b89ccf49057d8c7bc72e3fc6c9ce7720b8d44d48344d47d44d4fd44d43922ea1c11754644dde3154d133fcfd3548840cc2b6c31afb0c5bc8268257e29c52cc09dfb7e1810fca005042afe110a02bef830e709cca83f93d2735ea497d441f8faa38957b6358702565cc809908de53a437ad63b4ceee8e555c55998e7b2304042cff1e5a316810586219053c9a8972f615ec2193b2760e86d2996f5d25327d2c2c17c6ea5b3b16cb25f2335ac1c97cdcb7549f0452e2dc2e0fd87483640f219c53231de27132c11280acf52066c81698c3f30b783fe1656596ab6a645b8f2d936467b354cc66a6a0ceb85541771dc2721c172e3184529eae033c15d8670d2c1c96780b300970e00d0c2530a3d3359a63cb2d08aa746b9e65248a89c42fb2b7155c516f59e96b6a2674b9f907b6b8c7a359d0f51ac7c989671fba37df5d12b040542bc640a1c31547a5a9c00423d2d4f24aaf3e039644d1ab6200b0daa68d4ceca13651b2451cce773cca72058227785711106c32e62f230d0c60f1ec82c84b0f4c632575d99475ee462fa601ea9369ff837e708c77890d501a4cb5932617c5bd1bd53f56511050eccbd44cf1b7998c24ba0c73542b82404b6abb990dc85a8df568bb4cb3d704f9878746f28cbf469f80951d08994f052a5df852ecdf986c27c43632101f20d4d82abadf01a0dc90617b1315f00da414a50d5bdb5d888d6ad0183f05e062461a279aaffc0148750fc915ab4750ae2230ef50b5cffc488dfa330dc45f45b6d76f090521a4403f4ecac7c4e15ed36feb8c52ada847a234beea10dd5ec3616fb4f8b0105233c28f7fb197a129e1ea3d2c9240a3e29005579b0977324d42d57e8e51283dea56f497c2e51cbbd1a759f6bd858faaed972e72e7d88b15ec5da3499d3a67d4e9bce4a54a71b86346fb0f1272ed0c6a1f36fa4f29801ffd7ce2fe7f5065c1ee877668eb0e816187d8580b4d2606e8249b53818579c437c40c1863c97c36cb6a18add50e5fbdd50c5027faf0df9d68d27eb770579b5ef46c66e643c30a8901b5471f4a96c121260652d601ad199415c2de047a53a42a41a31052c3dc42f21eb0d3bba47cba8dfc7a159264a65d574df5205abcdde40a5d91b23b3e05bb50315dfce1f311f0081fe54587f0a2eb6a16debf8f028ad88bd48bc778ab4d0e0f903f8203063f1a8f52a86e49bb18e51decffd220972f57e0fac7b80f5fe80d688050520f89116566390fcada4805707ba586ef7d285563282188a88b96809bfd24a22b2afa6c819bf971ecad8d7e23a658931682e491e6a9952aa3ae9f947052afe368922927651e97d10ce229d40446684d2f2c844a648af50950b3c8c174d55573a13d35c1ef172bef3af34955b47723904791b4d07817400c8a75a1b39511da1a6a04cb03967af02ae929ca84f4ed447278a35a610a559630d639d130d73859324c0c442b31fd558b37d2d3b502c50e0d1d58d5c418709fd0ed0dd84b6c29368c7108d041dc918a29121459c204286447890099dc010bcef01ee2b3a607de4a1967d07f03ebe2b3306c5c57560487990213e533a807d4596da452aaf61593fa25748ed11c79002d599606b052415e851c444c07584ae1424b874a2f93c8b0b43db498b49e9e3eb49441082b165e5c43f0c7411b8a97b25ab5e4ca03926f090c82e2cc03a786235c7b31f308b6b155a4ea90497fa6d0933f106a387ec5cc9fa6fc74a908930c53c8c2a9810385c8bfa4f12e5cf03c7fc350c27f07887aa753af5d61294a010e209f6cf28841aab7d9ec3a3b1ed7720bcd06415500ed0108160a1448c60e0d7db4da5b5f9be702f552f178210858abc85002b6a8129ce5723d603b06f10c348148e80d959c40e143b3eb1915464e4e846422f9ed8082b4f396992287a5bb87c285136b73279b79050da32e85616db2d5955b4831208db93b6078935e74607a6cca31811e1468be0c32a126b2660ad68a73924a528aa5cd2364cc24b4920c3650cab0a1c56791c568d70a9142660e10cd8ee05ce6e85fd760fd79bf0d1295d5020bbb795ed9ec8d93de9e0c9d4fa4ecd0ad6eef9836aa699e0b24ac55ddad0161b086ee5235eaae386561b4d9915a38c2b29e31b5b81fcaca47890f7af32d5c3c85b5bed188cddbcaac7aeda1d7af36da9090e55b14e4d38a4b39a7e967a687cd3673565de6a9281cbac261eb8f5520f0fad26397f14504d6567b69a9435f8f7c547a2b7490ad406cf8a9f8fc8d606a5607a6e748e15da3fe18eed36b97676fd600aa3f83ce4e2ae9d6d048da1c8c55d3b7b76d0f150d0db8782ae0c05bd7328683314f4d850d0b5a1a0770f053d3e14f49ea1a0278782de3714f4ba6b679b815fe4b5b3cd347ca36b67effe41298242fa42168c1cc23b3ddfa388c91ef43db58931dd7039fec0727c5c8ecfc6748a522577d5258dab7cc32e8b42b28b6678bd80f0f65f72f1f1b24a684dafcf67c8788e87910ecaef88bddc52a4c8f531bedcc24b547cbba488975b0213d1e596802eb7143181802ccf0478b9852f0461eadb77b965c4149190230ed62d7f04cde408ee0ba75d77b945b9cb2dca5dd183e0091e06afe8156d1e89130548099e8f33560eb4f397d52cd106aeac697b65adc22dbeb246451240107285e45f8026052e91f87c8d4ceed56fe4eac82d994f8b5bf1647605ebd35a7bee44e5074612fa448078ef5bde8779de17f2bc0f99f7851cefc38be1bd6f42e4bdef60dd827daa2058de8717c5fb7003de8719ef7de63dcf373cefedf5d56b324e3e21b5ee3fbce7545373b40671dee4e2837c0c2ee8ce027f65c0f878c0eedb0376778f80ef29daf0b5a6c693e0414a08368771170f037730af28a5a300173a21bafdcec32eba654329d0ce12a8072e022b152eb78b29b7db4aa7f3fcfd81ef72c15b0f6c8ebf0d40970f38d9a34c48df8717d340bc60912063b742f21276b8ceddbe466ccd5d2611eb2eb078587e5128d43267d1a54d00037b37974278266f4044cae10c37c6e90f04819c6cf81855de36eaee2b0478af84614a7952445f9254b450b9fd733dc2c8ab55ccf91fefdac35d7b9bef5a6fb46bcd3e70fdae75ffae6397cf795cc87118f5c618e58053b67b8edf383ac0e4cb5820289562d1a8e22d8f4dfb4f2ae9721a2a10d3b58f3469253675acb5ae56620a5a5788b1549ed841557881b22b7a62c1174adccd989aaad1704877e54994f3133b122aaee3a9bea059a3bb74ef22f57a2944f57a01a5d0c961c872286d51e86a35ce670ecf38fd968b997ecbe6d33b6d0fd13678eb553e049d0695ffc82399ca871844fa7d1993975de35faf2c03e1184d1ca2990839191e3413b39019f6648502332ca3a0c9c2e3182f17c3addfaf624f36b0590a01395d4dab34e70b32c903f205980504bcda1f186f824a0fa0b297cd20138a7f6934fa9ff566891502b27d980a1449a3223d58b59503fd02d929bb021f5700bf4e24c10eaabf5379829c9809765049c7ce65fc9b369c6b83d3c79c5556f4ff28d90fb6343407a46ac03abc50f7217be46de84b171cae507d767beecb17aac4a75e5ebbc75b5751d838dbe12b851bd9562fae8ff69b6a3ab2a55bc75cfdb1676a826eca93553cc48720028b531ed5015d15b9d2a2d7ecbef3c5298fab4eaa2aec8977c4851e4a86e85e229daf494a3df6ba3a5dcc9721f11805fa4a94abbcef511bf1d1f1c9af736dde5be7e65ec8dabc3de00ed1a2afafcd1fb587db7db579cc5a2617b0366fa9ea2355b5bdcc9f04842f57f2c3d760ce06a86a6bac1a565670c1505636f7736573c73aa3e399d13e9109364a5103a4ef1e62e3ba2c154f481163bf4d8deef165a9bfa4bebea83eb9d82baa8f73515d71519d423a8afe5556905659415a650569c505696ef597dc273728b9e74aedc4192ab5ffd16f7f66ece6b24cef85cf5ca51d47e8f4b73e73ef25786e8ffc919d0debec12a57972a1575b073edada3a72b4575bffbe36859471adc9beca7b7601da55dfe9db351b15a3e92b2aae2a2fa92a4f86bc5795c7831a5b8607a4457c4d7257ea3bd121b7ec67673aefb69247d5e31297d523ba5f0b83ded27aa514af06b78d9e02907301daad8e234fb7487bbb96966593cfdcf192e78e9748766de55cf1d99218d400c9fb41ecf6f26e94fbca044ba7bbe8f08ffcb509ed8e5b87b315e17a5ba1d95668b615e1a0ad40bbc0f73ff83273abe74fc283832a18f2177d06bc5638e896ed973ee0d1f2acd6a292f92099f8b2bab076759cbfd2816762b0273e8ba18b4d9c568aecca79dc7b2ef0c11a3f97e876094c141f472a8fb30db881eeebec121662b319c4c00c6260067a7e6e919d92b24be8943d52b2e8acccf6d0b9f70e9d7b76e8dcf36e7cdecd67337c771f708fed556346a1f6daab5a22fa578f0f202e889c43478d566476f9798b12d29eacf117b248150a54b2c80260757003c7eebb4b1903919bad3df4894876d43bd9a22bc9eb44845c2f114f66224271463fd9a9ab5f50a8ab5f56ecb51c2b2e8a1d4a2e84d9fd7c6d1750edcac7bc1be1f1d6e161e3895f734c543c37faec684612415f5d752236d647bdbc94e5a8a7d6534fada75e4fdcdcf73f06e2a00b54cc791f7e4b2677c919495d2161c46fc99230d3354196b81a9e9543c897e879bedc81d8993bca9dfbaedc5c56b68857bc9e4c307e7506c50088d7e678067d19fe298800bc21c5e8fc0d870006d86f5980f9c7bb203e594f04c6afecd0d7dbe86a9b87bae095e996007b230e8d21f53e419131520e67c238dc1d1b8b091bafbbf819dec5afb047bb99b1cbeb6d46b8e7043fdfa6917c84cce48c3964a60d6f77cec7d8741362db1f07c7f4355fd35fd8884e1fab37171ab3a6b36cea0b0bcb33f54ec3acd48f3756c5da52e3d44a63a6032f1bedf672db3497ccb1e6a9c6ecf4d1d39dc6aa99595e5aedb4d7663acb6dd1996b98e5251ec67feec6ccd49796963be668035a0b38c36cb30dd8164e0bf793beed61113de9d927fcf33880af515f34f54ea7b1b8d2e155bdb9dda425ad760cced2589a154561ff0c0fe08495764cf6d778ae3162a5bddc599e595e306e4c73d5e0427a7fb187ff0096827ffad9cd2b70ad3efc0be0dff2d1166c0707ac32000c6fd78118d3d8e63981628b6b0b9de6747369b6714a307df06f0235978e67e385a5d40cbc801919ef2ac276ea4717a0e398a9c3fbb9461b49de69c346d64fbeb83cdb3c767a9379ed0476cc454dc07f75a8edb83833575f3a0ed4683717ebedd366be71dabc79aeb16451e26eea4b16f1a604c57df7d3f378a3234408b42cc0bf11f857847f91c03fc5224473e9647da1396b4ed6dbcdfa12ee09b7f26c84126c6de47d25015cff0b0d35746300d00700008301010100202726ccb75fbe7efc448c24c0eba863d9358e0f49b7fb26a3e3652dcd3d9486892394b47ebd8648bf66200b820be0bbd29fc0357dc376a934531fa11a965d1e590100e70778da8d56bd8f1b45141f7ffbece4741c84e3522011441309c839c13a451447414341c147758465bcf3ec1d7977769999b5cf5053040a90e88284228420c55597263a2822b7484804d20005d08184f8177833bbde5def71e6a6d88ff7debc99f7deeffd665abf77dfae918f5f7cea1f82a3621ee4af2b6f9ad73df768be24b8f377aff7e9e6427273731d42c5c3ebd7e9803fbff35cafb235f04377ec283e125c8c1c1a6b2f945ccf2e4da8e45468e714bd33b9b2dd46278e479547aa8d702a40d6050da06e245dd70377ace2a0f742bf4d5dcd275403a9ac0f81ea5882c3f808942e5aad65ae497d4d7b129417faac1973a1aff6ea6398a973f870a6c0479edebf814edd30165a6d472003ae3028e1f830013f33694c29d7eabc7966b28ba78743aa6758f6829def7a940b27a212c3d5201579e4d1801ea4a912a09d58d1115827fd6b17359523d065ad13b93a5d66db4cd6920a653285712cbbb8da7b7240154e00b9d26a23f7ed034ce92c953fed8642c3817686124ce6954d5c6127220ece6aca40a4a68588dd285edac872c4997655c46517db01267895c113650f3e1f82e641963206439012181a1d3870107149addd940b164e53ab0b652f0cfc2c6f8f1b25173e17e0a46ac5df5b2cb07552cb20d29e55eff46d7a727815555d970a177cbb14a9ae277f0b346e94e1dc34fbe7acd82a1d9c8ab833e6a4da4a1bc1f65e279f9dfce7d825d51afe74a278e073d7c1cf66224f37d5c61d8cadc7fa92c7ba1b3248bef42c4abeba12de8db9840016cb0a845b3209a7bb129b3c4cc9207b240c917779d3b202e48256887a194aec43058221d8396bd9cdf576db28d1a6928dc14c833a912424207497ae594ec2d6290c41aa05cb93795f4acf66244316bbb8a99ca6aae7336116651ece69c47a0e93b72044b692115bc6d254a4521fca30b0fe9b0a34b26ea9ec35142599e918bdcf0324be5221d790ac1c6bd3b0b4d4314d9dc4980a4c8b15052df465aa5f72d49c0406090d9398ddb549304102c4ac25ff162ec956b08ada52a4229566f2f1dfec69d689249f94826a71e51871e2b86d8d4286ceda0a93c4621f1e3b5994fd1b9d586450aefd2f943b71c468da4af595ad644258e0bd6eecf352770b470ca9b6ed9f0237258a65206de0417cf9333c94f353917c7bf3f2cb1f7cf5d2122f90bdef7ebe73f8c52bc55ec7f1ecb8f6f54779af92bdcf6f5d62f76e151b10c76f0fde7ff865d64f9fbcd1ff05d8e1f132f270dc86e0f03843d9e2fab0801821dfbf7aec1dcd8b90c2b1f7cc8747f30c1a84dc7ff0d6eb77e78562e378e79bfdbbf3acac38767f40415e4213dcfd3ffff8a9582b1bb0ffdac36245cc4de636fdf1d79d1aef5f2324bf6fe0ade70c1794caaad39efc0b56a6590f0001 DMLOG START_BLOCK 5 DMLOG CREATION_OP ROOT 0 -DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304004,"value_ex":102691,"consumed":1},"cpu_usage":{"last_ordinal":1262304004,"value_ex":291686,"consumed":101},"ram_usage":199629} -DMLOG TRX_OP CREATE onblock 8c9d74241a58c14fa7b501cefbb295597ee361a0f3f5d5771bdec628f1e8303b 0000000000000000000000000000010000000000ea305500000000221acfa4010000000000ea305500000000a8ed32329906033b3d4b0000000000ea30550000000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d9124a405bf28429701bc7daad6eee3c8e0cbd102e2100c1c49bc26f42ebce3147fe5fd364290bd2ae66d14935b5be2da8e14e91e76cede8b276cbadfaf82254f590000000000010000a105151a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b7241ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea994a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0fe0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff52668dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a297428ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c438ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a4052652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d674fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c2299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b4476707c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead450715443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b4bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e99d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb406bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc35c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b98c4175db53ed27e7911a1b5adf0e7db0fc96c2cae172cf594dfa9a742ca9e88fce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb409e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc16000000 -DMLOG APPLIED_TRANSACTION 5 8c9d74241a58c14fa7b501cefbb295597ee361a0f3f5d5771bdec628f1e8303b05000000043b3d4b010000000524306a71a27251572631b46c9df864e3148a595ab26a871a94bbc39f01006400000000000000000000000000000000000000000001010000010000000000ea3055b08b1060ddeec5fa7586b2a675ef85d66328fbb88ee50a3f5317b09eaa987d521d000000000000001d00000000000000010000000000ea30551d0000000000000002020000000000ea30550000000000ea305500000000221acfa4010000000000ea305500000000a8ed32329906033b3d4b0000000000ea30550000000000036934f742f4d1a5118fcdd0da4b3ca95cbb6efa0062eaef8342ed0d9124a405bf28429701bc7daad6eee3c8e0cbd102e2100c1c49bc26f42ebce3147fe5fd364290bd2ae66d14935b5be2da8e14e91e76cede8b276cbadfaf82254f590000000000010000a105151a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b7241ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea994a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0fe0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff52668dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a297428ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c438ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a4052652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d674fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c2299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b4476707c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead450715443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b4bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e99d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb406bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc35c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b98c4175db53ed27e7911a1b5adf0e7db0fc96c2cae172cf594dfa9a742ca9e88fce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb409e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc16000000000000000000008c9d74241a58c14fa7b501cefbb295597ee361a0f3f5d5771bdec628f1e8303b05000000043b3d4b010000000524306a71a27251572631b46c9df864e3148a595ab26a871a94bbc39f0000000000000000 +DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304004,"value_ex":102737,"consumed":1},"cpu_usage":{"last_ordinal":1262304004,"value_ex":291686,"consumed":101},"ram_usage":199629} +DMLOG TRX_OP CREATE onblock 136018ca05564fd0c886d02fccf608e1b6d3c79b0c81e49569afef12a478fa94 0000000000000000000000000000010000000000ea305500000000221acfa4010000000000ea305500000000a8ed32329906033b3d4b0000000000ea30550000000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440fb1731b78038b7fd1e418d83062417a2c12a515dde5d4d8bbd2610bb46ce01b8888fd15e295bb3585742c5737bf6bd6deb93ece7f776af86767a2bc20834cff0000000000010000a105151a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b7241ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea994a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0fe0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff52668dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a297428ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c438ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a4052652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d674fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c2299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b4476707c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead450715443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b4bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e99d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb406bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc35c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b63320dd4a58212e4d32d1f58926b73ca33a247326c2a5e9fd39268d2384e011afce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb409e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc16000000 +DMLOG APPLIED_TRANSACTION 5 136018ca05564fd0c886d02fccf608e1b6d3c79b0c81e49569afef12a478fa9405000000043b3d4b010000000592c5b38047f9308c633fa2d88c9df8de6c6a0caee99923c031c5a0d901006400000000000000000000000000000000000000000001010000010000000000ea3055ab1772852933c699ca399b6f18cd329e094798e0b65417b0ee6bcc679475f7201d000000000000001d00000000000000010000000000ea30551d0000000000000002020000000000ea30550000000000ea305500000000221acfa4010000000000ea305500000000a8ed32329906033b3d4b0000000000ea30550000000000033f35e12a8f3c21ef9cda1761752bf23de04ebd9a635044c75fda0b440fb1731b78038b7fd1e418d83062417a2c12a515dde5d4d8bbd2610bb46ce01b8888fd15e295bb3585742c5737bf6bd6deb93ece7f776af86767a2bc20834cff0000000000010000a105151a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b7241ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea994a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0fe0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff52668dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a297428ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c438ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a4052652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d674fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c2299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b4476707c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead450715443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b4bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e99d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb406bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc35c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b63320dd4a58212e4d32d1f58926b73ca33a247326c2a5e9fd39268d2384e011afce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb409e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc1600000000000000000000136018ca05564fd0c886d02fccf608e1b6d3c79b0c81e49569afef12a478fa9405000000043b3d4b010000000592c5b38047f9308c633fa2d88c9df8de6c6a0caee99923c031c5a0d90000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG PERM_OP INS 0 9 {"usage_id":8,"parent":0,"owner":"alice","name":"owner","last_updated":"2020-01-01T00:00:02.000","auth":{"threshold":1,"keys":[{"key":"EOS6JvuLaCqV8qHbSqUBVRPMo9N7V3vgE8YqHmweG568YmTDJ3opq","weight":1}],"accounts":[{"permission":{"actor":"alice","permission":"eosio.code"},"weight":1}],"waits":[]}} DMLOG PERM_OP INS 0 10 {"usage_id":9,"parent":9,"owner":"alice","name":"active","last_updated":"2020-01-01T00:00:02.000","auth":{"threshold":1,"keys":[{"key":"EOS8d5yGFrYpdXW1SUmaavRZKm5X7Bp9jK634JABCYPciwTkm7Wv2","weight":1}],"accounts":[{"permission":{"actor":"alice","permission":"eosio.code"},"weight":1}],"waits":[]}} DMLOG RLIMIT_OP ACCOUNT_LIMITS INS {"owner":"alice","net_weight":-1,"cpu_weight":-1,"ram_bytes":-1} DMLOG RLIMIT_OP ACCOUNT_USAGE INS {"owner":"alice","net_usage":{"last_ordinal":0,"value_ex":0,"consumed":0},"cpu_usage":{"last_ordinal":0,"value_ex":0,"consumed":0},"ram_usage":0} DMLOG RAM_OP 0 alice account add newaccount alice 2788 2788 -DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304004,"value_ex":104034,"consumed":233},"cpu_usage":{"last_ordinal":1262304004,"value_ex":303261,"consumed":2101},"ram_usage":199629} -DMLOG APPLIED_TRANSACTION 5 28f22869118192fc6a989ff0a6fb54f7cf1080aa2a1c2b9991cb5595eaa25e2e05000000043b3d4b010000000524306a71a27251572631b46c9df864e3148a595ab26a871a94bbc39f0100d00700001d0000000000000000e8000000000000000001010000010000000000ea30554895e298f1f3e56596649fb49ff53d0f76174ef57ef7c50f28152765cef1f97f1e000000000000001e00000000000000010000000000ea30551e0000000000000002020000000000ea30550000000000ea305500409e9a2264b89a010000000000ea305500000000a8ed32328a010000000000ea30550000000000855c3401000000010002bb30f6894f29bb6fca635b1df728ad77e48fdd6123ce5e4455b0f71e072e7df80100010000000000855c3400804a1401ea305501000001000000010003ebcf44b45a71d4f225768f602d1e2e2b25ef779ee9897fe744bf1a16e85423d50100010000000000855c3400804a1401ea30550100000000000000000000000028f22869118192fc6a989ff0a6fb54f7cf1080aa2a1c2b9991cb5595eaa25e2e05000000043b3d4b010000000524306a71a27251572631b46c9df864e3148a595ab26a871a94bbc39f010000000000855c34e40a00000000000000000000000000 +DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304004,"value_ex":104080,"consumed":233},"cpu_usage":{"last_ordinal":1262304004,"value_ex":303261,"consumed":2101},"ram_usage":199629} +DMLOG APPLIED_TRANSACTION 5 e833edff0c91079174afc19cd1e3bd119711c08616746603e472d5a21c885f8505000000043b3d4b010000000592c5b38047f9308c633fa2d88c9df8de6c6a0caee99923c031c5a0d90100d00700001d0000000000000000e8000000000000000001010000010000000000ea30554895e298f1f3e56596649fb49ff53d0f76174ef57ef7c50f28152765cef1f97f1e000000000000001e00000000000000010000000000ea30551e0000000000000002020000000000ea30550000000000ea305500409e9a2264b89a010000000000ea305500000000a8ed32328a010000000000ea30550000000000855c3401000000010002bb30f6894f29bb6fca635b1df728ad77e48fdd6123ce5e4455b0f71e072e7df80100010000000000855c3400804a1401ea305501000001000000010003ebcf44b45a71d4f225768f602d1e2e2b25ef779ee9897fe744bf1a16e85423d50100010000000000855c3400804a1401ea305501000000000000000000000000e833edff0c91079174afc19cd1e3bd119711c08616746603e472d5a21c885f8505000000043b3d4b010000000592c5b38047f9308c633fa2d88c9df8de6c6a0caee99923c031c5a0d9010000000000855c34e40a00000000000000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG PERM_OP INS 0 11 {"usage_id":10,"parent":10,"owner":"alice","name":"test1","last_updated":"2020-01-01T00:00:02.000","auth":{"threshold":1,"keys":[],"accounts":[{"permission":{"actor":"eosio","permission":"active"},"weight":1}],"waits":[]}} DMLOG RAM_OP 0 11 auth add updateauth_create alice 3108 320 DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"alice","net_usage":{"last_ordinal":1262304004,"value_ex":834,"consumed":144},"cpu_usage":{"last_ordinal":1262304004,"value_ex":11575,"consumed":2000},"ram_usage":3108} -DMLOG APPLIED_TRANSACTION 5 612c4d9ce65e73509525a5082272046a1fee8d4451675f6388fc0b35b91d1cb205000000043b3d4b010000000524306a71a27251572631b46c9df864e3148a595ab26a871a94bbc39f0100d007000012000000000000000090000000000000000001010000010000000000ea3055f3d881d2f7fbf2f7cb6081aff84e7aca1dd3914a0948ef4fc9422e734e8d4d571f000000000000001f00000000000000010000000000855c34010000000000000002020000000000ea30550000000000ea30550040cbdaa86c52d5010000000000855c3400000000a8ed3232310000000000855c34000000008090b1ca00000000a8ed32320100000000010000000000ea305500000000a8ed323201000000000000000000000000612c4d9ce65e73509525a5082272046a1fee8d4451675f6388fc0b35b91d1cb205000000043b3d4b010000000524306a71a27251572631b46c9df864e3148a595ab26a871a94bbc39f010000000000855c34400100000000000000000000000000 -DMLOG RLIMIT_OP STATE UPD {"average_block_net_usage":{"last_ordinal":4,"value_ex":147184444,"consumed":8002},"average_block_cpu_usage":{"last_ordinal":4,"value_ex":415951447,"consumed":4482},"pending_net_usage":376,"pending_cpu_usage":4100,"total_net_weight":0,"total_cpu_weight":0,"total_ram_bytes":0,"virtual_net_limit":1051726,"virtual_cpu_limit":200600} -DMLOG RLIMIT_OP STATE UPD {"average_block_net_usage":{"last_ordinal":5,"value_ex":149091240,"consumed":522},"average_block_cpu_usage":{"last_ordinal":5,"value_ex":446651851,"consumed":4513},"pending_net_usage":0,"pending_cpu_usage":0,"total_net_weight":0,"total_cpu_weight":0,"total_ram_bytes":0,"virtual_net_limit":1052778,"virtual_cpu_limit":200800} -DMLOG ACCEPTED_BLOCK 5 05000000050000000400000000000000010000000000ea3055000100000001000240e54a7b27e042b80a810153bec1dd166eef95fa69f6c9886ae283363bc2add80100019d8615dc61a6c0a52ed12e7a500ab20d3701f511a1a9f02979b6fdbbc47235f70400000000000000010000000000ea305505000000010000000000ea305504000000000100000001000240e54a7b27e042b80a810153bec1dd166eef95fa69f6c9886ae283363bc2add80100000000000524306a71a27251572631b46c9df864e3148a595ab26a871a94bbc39f043b3d4b0000000000ea30550000000000040fe1293299472996f03cf30560d9279afc23397ac2c9e2bd8ebf9daa22e6cfda01d30da5432da7d623007e34045ba89f3def4ae38d6ca3b0d4b4399dcfb7b9566554815d9e18b9d2e6757e9207509e9374068757e25fbab527e837c3000000000000001f6b7f5549f0dd4b25d8a3a5bbd9cc818b52e134b65683ee101d80310444d709545cf1f79fdd3a7300ec3376e86382209f776d4cf0dd83eb5e252985163bb6f2680000000029807708239aa7de914d3ed61e9009ab2280bfbc50f1d9769f27f8341ef261980000000000011609e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc160ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd1a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b72412652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b447670735c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b4a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0f4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d674fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c25443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b468dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a2974286bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc8ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a40598c4175db53ed27e7911a1b5adf0e7db0fc96c2cae172cf594dfa9a742ca9e88ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c43bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e99c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead45071d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb40e0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff526ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea99f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1dfce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb40001043b3d4b0000000000ea30550000000000040fe1293299472996f03cf30560d9279afc23397ac2c9e2bd8ebf9daa22e6cfda01d30da5432da7d623007e34045ba89f3def4ae38d6ca3b0d4b4399dcfb7b9566554815d9e18b9d2e6757e9207509e9374068757e25fbab527e837c3000000000000001f6b7f5549f0dd4b25d8a3a5bbd9cc818b52e134b65683ee101d80310444d709545cf1f79fdd3a7300ec3376e86382209f776d4cf0dd83eb5e252985163bb6f2680200d00700001d0101001f4ac035706be50776ed8c0cbd24163b873e4a5c0ff031999288b7af899f47b3435f40caadfd97c6a390d411329871aa8a58470e03cc2fa8d141e1131f51e825200000bd0107e10b5e04009947299600000000010000000000ea305500409e9a2264b89a010000000000ea305500000000a8ed32328a010000000000ea30550000000000855c3401000000010002bb30f6894f29bb6fca635b1df728ad77e48fdd6123ce5e4455b0f71e072e7df80100010000000000855c3400804a1401ea305501000001000000010003ebcf44b45a71d4f225768f602d1e2e2b25ef779ee9897fe744bf1a16e85423d50100010000000000855c3400804a1401ea30550100000000d0070000120101001f1decae1dbe477186cc5e0e40d0fa648d84b45709feb3d6271df381be75ff87747eb9d84e9eba877101fde07f045944b06b0841d0a7d31a8320a90a05beb5fd1d00006307e10b5e04009947299600000000010000000000ea30550040cbdaa86c52d5010000000000855c3400000000a8ed3232310000000000855c34000000008090b1ca00000000a8ed32320100000000010000000000ea305500000000a8ed3232010000000001 +DMLOG APPLIED_TRANSACTION 5 1df1c2ab06533303d4172d84dd42b5e5ed8297f65fa0214b0a4f439788d47b4705000000043b3d4b010000000592c5b38047f9308c633fa2d88c9df8de6c6a0caee99923c031c5a0d90100d007000012000000000000000090000000000000000001010000010000000000ea3055f3d881d2f7fbf2f7cb6081aff84e7aca1dd3914a0948ef4fc9422e734e8d4d571f000000000000001f00000000000000010000000000855c34010000000000000002020000000000ea30550000000000ea30550040cbdaa86c52d5010000000000855c3400000000a8ed3232310000000000855c34000000008090b1ca00000000a8ed32320100000000010000000000ea305500000000a8ed3232010000000000000000000000001df1c2ab06533303d4172d84dd42b5e5ed8297f65fa0214b0a4f439788d47b4705000000043b3d4b010000000592c5b38047f9308c633fa2d88c9df8de6c6a0caee99923c031c5a0d9010000000000855c34400100000000000000000000000000 +DMLOG RLIMIT_OP STATE UPD {"average_block_net_usage":{"last_ordinal":4,"value_ex":147251111,"consumed":8010},"average_block_cpu_usage":{"last_ordinal":4,"value_ex":415951447,"consumed":4482},"pending_net_usage":376,"pending_cpu_usage":4100,"total_net_weight":0,"total_cpu_weight":0,"total_ram_bytes":0,"virtual_net_limit":1051726,"virtual_cpu_limit":200600} +DMLOG RLIMIT_OP STATE UPD {"average_block_net_usage":{"last_ordinal":5,"value_ex":149157352,"consumed":523},"average_block_cpu_usage":{"last_ordinal":5,"value_ex":446651851,"consumed":4513},"pending_net_usage":0,"pending_cpu_usage":0,"total_net_weight":0,"total_cpu_weight":0,"total_ram_bytes":0,"virtual_net_limit":1052778,"virtual_cpu_limit":200800} +DMLOG ACCEPTED_BLOCK 5 05000000050000000400000000000000010000000000ea3055000100000001000240e54a7b27e042b80a810153bec1dd166eef95fa69f6c9886ae283363bc2add801000103aae4b42beeefea68f9878b7c7389d18a14b2d0a0209958df6d3f76f5ed5f480400000000000000010000000000ea305505000000010000000000ea305504000000000100000001000240e54a7b27e042b80a810153bec1dd166eef95fa69f6c9886ae283363bc2add80100000000000592c5b38047f9308c633fa2d88c9df8de6c6a0caee99923c031c5a0d9043b3d4b0000000000ea3055000000000004119dde5dc2ba60b1c4f1013a50ea81abfa00d53b1c9bd42d37f5a79e86e28d6bbfdb013ed6f68649464fdd7677c41d9a51a4f16c062b63e708cd1bc48dbf44801695e167a47f19f378d872cc2126e8dae13812dd5bbc0e55b959a1fd000000000000002059e8e647d1b8192cd906247d0ccd066da0fcf8fba0748a861ab3f2d20784f0c9716e75cc460fc5885f32a2973edf02cf2fa382af09c07b7b3243ae61d24571790000000029807708239aa7de914d3ed61e9009ab2280bfbc50f1d9769f27f8341ef261980000000000011609e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc160ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd1a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b72412652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b447670735c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b4a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0f4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d674fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c25443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b463320dd4a58212e4d32d1f58926b73ca33a247326c2a5e9fd39268d2384e011a68dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a2974286bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc8ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a405ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c43bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e99c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead45071d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb40e0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff526ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea99f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1dfce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb40001043b3d4b0000000000ea3055000000000004119dde5dc2ba60b1c4f1013a50ea81abfa00d53b1c9bd42d37f5a79e86e28d6bbfdb013ed6f68649464fdd7677c41d9a51a4f16c062b63e708cd1bc48dbf44801695e167a47f19f378d872cc2126e8dae13812dd5bbc0e55b959a1fd000000000000002059e8e647d1b8192cd906247d0ccd066da0fcf8fba0748a861ab3f2d20784f0c9716e75cc460fc5885f32a2973edf02cf2fa382af09c07b7b3243ae61d24571790200d00700001d01010020778bb3ea5abb6b92bc3b7d45a0185e56911ab64544edec77baa4400e8190a3257d22d082e982c40c059de118168eaff6c868ffa3b0f67d37b431f442bd1b46c30000bd0107e10b5e0400c2ba60b100000000010000000000ea305500409e9a2264b89a010000000000ea305500000000a8ed32328a010000000000ea30550000000000855c3401000000010002bb30f6894f29bb6fca635b1df728ad77e48fdd6123ce5e4455b0f71e072e7df80100010000000000855c3400804a1401ea305501000001000000010003ebcf44b45a71d4f225768f602d1e2e2b25ef779ee9897fe744bf1a16e85423d50100010000000000855c3400804a1401ea30550100000000d0070000120101001f2ea70bcd36a59b5cffc0188010939d1990335ca2c57c9bff33212db45802bc426a261cfbebd74e78d2ae520b3c8ccd0ee633aefb2df81156bd4bfc3dcac46a7200006307e10b5e0400c2ba60b100000000010000000000ea30550040cbdaa86c52d5010000000000855c3400000000a8ed3232310000000000855c34000000008090b1ca00000000a8ed32320100000000010000000000ea305500000000a8ed3232010000000001 From 11640bf1433dea2fd5e87af62e7244bf570c1d39 Mon Sep 17 00:00:00 2001 From: yarkin Date: Thu, 30 Nov 2023 01:52:24 +0800 Subject: [PATCH 22/24] Update to latest bls lib. --- libraries/libfc/libraries/bls12-381 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/libfc/libraries/bls12-381 b/libraries/libfc/libraries/bls12-381 index ec8e8d5858..8871e5efef 160000 --- a/libraries/libfc/libraries/bls12-381 +++ b/libraries/libfc/libraries/bls12-381 @@ -1 +1 @@ -Subproject commit ec8e8d585873e1775983782c274792da6315acf2 +Subproject commit 8871e5efefdcb0f2a1315ed0942a6124022a7ac5 From 87738aaeec12ce1dbac027ea28b6a4d0a41f1d98 Mon Sep 17 00:00:00 2001 From: greg7mdp Date: Wed, 29 Nov 2023 18:53:15 -0500 Subject: [PATCH 23/24] remove `(multi-exponentiation)` from comments. --- libraries/chain/include/eosio/chain/webassembly/interface.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/chain/include/eosio/chain/webassembly/interface.hpp b/libraries/chain/include/eosio/chain/webassembly/interface.hpp index e138e18e84..84c76a467c 100644 --- a/libraries/chain/include/eosio/chain/webassembly/interface.hpp +++ b/libraries/chain/include/eosio/chain/webassembly/interface.hpp @@ -1808,7 +1808,7 @@ namespace webassembly { int32_t bls_g2_add(span op1, span op2, span result) const; /** - * Host function for G1 weighted sum (multi-exponentiation) on the elliptic curve bls12-381 + * Host function for G1 weighted sum on the elliptic curve bls12-381 * * @ingroup crypto * @param points - a span containing a list of G1 points (P0, P1, P2... Pn) - 96*n bytes little-endian. @@ -1820,7 +1820,7 @@ namespace webassembly { int32_t bls_g1_weighted_sum(span points, span scalars, const uint32_t n, span result) const; /** - * Host function for G2 weighted sum (multi-exponentiation) on the elliptic curve bls12-381 + * Host function for G2 weighted sum on the elliptic curve bls12-381 * * @ingroup crypto * @param points - a span containing a list of G2 points (P0, P1, P2... Pn) - 192*n bytes little-endian. From 804e415ea0e3ca6b3f01f6f6bf6e47c676374806 Mon Sep 17 00:00:00 2001 From: greg7mdp Date: Wed, 29 Nov 2023 18:55:20 -0500 Subject: [PATCH 24/24] Update bls12 submodule to tip of `main` branch. --- libraries/libfc/libraries/bls12-381 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/libfc/libraries/bls12-381 b/libraries/libfc/libraries/bls12-381 index 8871e5efef..13888087ac 160000 --- a/libraries/libfc/libraries/bls12-381 +++ b/libraries/libfc/libraries/bls12-381 @@ -1 +1 @@ -Subproject commit 8871e5efefdcb0f2a1315ed0942a6124022a7ac5 +Subproject commit 13888087ac9225b1f266fee8b149c4effe10fabb